Закупки ekt.kz — AI-планировщик закупок
Сервис загружает по 6 отчётов 1С на поставщика (Systeme Electric, IEK), считает рекомендуемый заказ по каждому SKU с обоснованием и срочностью, даёт…
О проекте
Команда: VT2k15
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Сервис загружает по 6 отчётов 1С на поставщика (Systeme Electric, IEK), считает рекомендуемый заказ по каждому SKU с обоснованием и срочностью, даёт менеджеру поправить и утвердить заказ с выгрузкой в Excel.
Как устроено
Kotlin/Spring Boot backend парсит Excel-отчёты (динамика продаж, продажи и остатки, товар в пути, сезонность, кратность), детектор аномалий очищает спрос от разовых крупных продаж. Прогноз спроса на горизонт «срок поставки + период между заказами» с сезонным коэффициентом, трендом и страховым запасом, минус остаток и товар в пути, округление до кратности упаковки. React-фронт показывает план по поставщикам, карточку с пошаговым обоснованием и экспорт утверждённого заказа в .xlsx.
Ключевые решения
- детектор аномальных продаж
- сезонный коэффициент
- тренд
- страховой запас
- lead time + review period
- округление по кратности
Особенности
Один из немногих бэкендов на Kotlin/Spring Boot, с обширными юнит-тестами парсеров и расчёта на XML-фикстурах отчётов; фронт работает на MSW-моках независимо от бэкенда.
Стек
Kotlin · Spring Boot · Java 21 · Gradle · React 19 · TypeScript · Vite · TanStack Query · nginx · Docker Compose · Python (прототип)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-9d786eb9-vt2k15.
README
README.mdТрек · 05 Логистика
Автоматический расчет заказов поставщикам для пополнения склада
Наша платформа не просто помогает формировать заказ, а сама сообщает о том, что необходимо отправить заявку.
Интегрируясь с 1С(или любой другой CRM) она всегда имеет доступ к актуальным данным, что поможет быстро реагировать на разовые крупные продажи и оперативно пополнять запасы на складах.
Система учитывает: динамику продаж, тенденции, сроки поставок, цены поставщиков, объем складов, наличие на складах, товары в пути и юнит экономику.
Каждая крупная продажа высвечивается у менеджера, и он решает учитывать ли её для будущих расчетов, на случай если он знает что подобные заказы будут стабильными.
А когда товары на исходе, система выбирает поставщика, исходя из цены, сроки их доставки и прогнозируемом убытке, для того чтобы выбрать наиболее выгодный вариант исходя из большого количества данных
Сущности(свойства):
- Поставщик товаров(Название поставщика, реквизиты, срок поставки товаров, дни заявок(если есть определенные), минимальная сумма заказа)
- Товары(Наименование, Поставщик(список, на случай если один и тот же товар у нескольких поставщиков), Код(возможно несколько в зависимости от поставщика), цена закупки(возможно несколько в зависимости от поставщика), цена продажи, Количество на складе(список в зависимости от количества складов), количество в пути на склад(список в зависимости от количества складов))
- Склады(Общий объем, свободный объем)
Закупки ekt.kz — AI-планировщик закупок
Загрузите выгрузки из 1С — получите готовый заказ поставщику с обоснованием по каждой позиции.
Сервис сам считает, что и сколько дозаказать по каждому SKU: очищает спрос от разовых всплесков, учитывает сезонность, тренд, товар в пути, страховой запас и кратность упаковки — и объясняет каждую строку. Менеджеру остаётся проверить, поправить и выгрузить заказ в Excel.

| Загрузка выгрузок 1С | Обоснование по позиции |
|---|---|
![]() | ![]() |
Зачем это
Закупщик вручную сводит десяток отчётов по каждому поставщику, чтобы понять, что заканчивается. Это долго и субъективно. Наш сервис:
- считает заказ автоматически — прогноз спроса на горизонт «срок поставки + период между заказами», минус остаток и товар в пути, с округлением до кратности упаковки;
- объясняет каждую цифру — очищенный спрос, сезонный коэффициент, тренд, страховой запас — видно, почему рекомендовано именно столько;
- подсвечивает срочное — позиции, которые вот-вот закончатся, отмечаются приоритетом;
- держит менеджера у руля — разовые крупные продажи можно исключить из спроса, любое количество — поправить с указанием причины;
- отдаёт результат в 1С — утверждённый заказ выгружается в Excel-файл.
Работает с двумя поставщиками — Systeme Electric и IEK. Можно загрузить одного или обоих.
Быстрый старт (Docker)
Нужен только Docker с плагином Compose. Из корня репозитория:
docker compose up --build
Откройте http://localhost:8081 — фронтенд и backend поднимаются вместе, /api/* проксируется на backend автоматически.
| Сервис | Что это | Адрес |
|---|---|---|
frontend | React + Vite за nginx | http://localhost:8081 |
backend | Spring Boot, разбор Excel и расчёт заказов | http://localhost:8080 |
Остановить: docker compose down.
Как это работает
- Загрузка — перетащите отчёты (по 6 на поставщика: динамика продаж, ежемесячные продажи и остатки, товар в пути, сезонность, кратность). Поставщик и тип определяются по имени файла; можно грузить одного поставщика или обоих.
- План заказа — сервис показывает рекомендованный заказ: сводка, вкладки по поставщикам, фильтр срочности, поиск. Клик по строке открывает карточку с пошаговым обоснованием.
- Утверждение — правите количества при необходимости и нажимаете «Утвердить» → скачивается Excel-файл заказа для 1С.
Как устроено
| Слой | Технологии |
|---|---|
| Frontend | React 19, TypeScript, Vite, TanStack Query |
| Backend | Spring Boot + Kotlin, Java 21, Gradle |
| Обмен | REST + multipart/form-data, данные хранятся в памяти backend |
Запуск без Docker
Backend (нужен JDK 21, Gradle не требуется — wrapper в проекте):
./gradlew bootRun # http://localhost:8080
Frontend (нужен Node.js 20+):
cd frontend
npm install
npm run dev # http://localhost:5173, работает на моках
Фронтенд по умолчанию работает на моках (бэкенд не нужен). Чтобы ходить в настоящий backend: VITE_USE_MOCKS=false BACKEND_URL=http://localhost:8080 npm run dev.
API
| Запрос | Назначение |
|---|---|
POST /api/excel | Загрузка отчётов (multipart/form-data, поля iekMoq, systemeSalesDynamics, …). Поставщик — все 6 отчётов либо ни одного; хотя бы один обязателен. Возвращает счётчики записей и замечания к ячейкам. |
GET /api/orders | Рекомендованный заказ по последней загрузке. Обязательные leadDays и reviewDays; опционально historyMonths, forecastGrowthPercent, supplierId, category. |
Подробности: контракт расчёта, формулы и ограничения — в docs/order_calculation.md; типизированные модели Excel — в docs/excel_models.md; экраны и сценарии фронтенда — в frontend/README.md.
Что в репозитории
| Путь | Что это |
|---|---|
frontend/ | Веб-интерфейс: загрузка, план заказа, карточка позиции, утверждение |
src/main/kotlin/ | REST endpoints, Excel-парсеры, DTO, расчёт рекомендаций |
src/test/kotlin/ | Тесты загрузки, разбора и расчёта |
docs/ | Дизайн решения, контракт расчёта, модели данных |
design/ | Макеты экранов |
Команда
- Nagmetulla Temirlan
- Orynbassar Onggar
- Gabit Bolatkhan
Hackathon team repository for VT2k15.
Авторы коммитов
История коммитов
- 2026-09-23 18:03Update README.mdBolatkhan
- 2026-09-23 18:02docs: keep the selling README on top (drop duplicated preamble from merge)Nagmetulla Temirlan
- 2026-09-23 18:01Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
- 2026-09-23 18:01docs(frontend): refresh screenshots to current UINagmetulla Temirlan
- 2026-09-23 18:00Update README.mdBolatkhan
- 2026-09-23 17:59Update README.mdBolatkhan
- 2026-09-23 17:56Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
- 2026-09-23 17:55feat(frontend): approve exports order to Excel (.xlsx); README as product pitchNagmetulla Temirlan
Все коммиты (44)
- 2026-09-23 17:50Update README.mdBolatkhan
- 2026-09-23 17:48Merge remote-tracking branch 'origin/main'Onggar Orynbassar
- 2026-09-23 17:48feat add anomaly detectorOnggar Orynbassar
- 2026-09-23 17:46Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
- 2026-09-23 17:46feat(frontend): connect order plan to real backend GET /api/ordersNagmetulla Temirlan
- 2026-09-23 17:43Update README.mdBolatkhan
- 2026-09-23 17:41fix(docker): publish frontend on :8081 to avoid clash with vite dev (5173); nginx listen IPv6Nagmetulla Temirlan
- 2026-09-23 17:41Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
- 2026-09-23 17:39feat addOnggar Orynbassar
- 2026-09-23 17:38feat: connect frontend upload to real backend + Docker ComposeNagmetulla Temirlan
- 2026-09-23 17:12Merge remote-tracking branch 'origin/main' into front/optional-supplier-dockerNagmetulla Temirlan
- 2026-09-23 17:09feat: now optional fieldOnggar Orynbassar
- 2026-09-23 17:02Merge remote-tracking branch 'origin/main' into front/optional-supplier-dockerNagmetulla Temirlan
- 2026-09-23 17:02feat(frontend): optional single-supplier upload (all-or-nothing per supplier)Nagmetulla Temirlan
- 2026-09-23 16:56feat: add backendOnggar Orynbassar
- 2026-09-23 16:49add IDEA.mdBolatkhan
- 2026-09-23 16:46Merge pull request #4 from BAITC-Hacks/front/two-suppliersTemirlan Nagmetulla
- 2026-09-23 16:45Merge remote-tracking branch 'origin/main' into front/two-suppliersNagmetulla Temirlan
- 2026-09-23 16:36docs: readme под приложениеOnggar Orynbassar
- 2026-09-23 16:17Merge pull request #3 from BAITC-Hacks/front/mock-uiTemirlan Nagmetulla
- 2026-09-23 16:00Merge pull request #2 from BAITC-Hacks/front/mock-uiTemirlan Nagmetulla
- 2026-09-23 15:53fix_readmeBolatkhan
- 2026-09-23 15:36docs: add front contractOnggar Orynbassar
- 2026-09-23 14:35Merge pull request #1 from BAITC-Hacks/systemelectricTemirlan Nagmetulla
- 2026-09-23 14:19docs: add docsOnggar Orynbassar
- 2026-09-23 14:04Add Bolatkhan.md fileBolatkhan
- 2026-09-23 14:02docs: heartbeat Stayin' AliveOnggar Orynbassar
- 2026-09-23 13:06docs: testOnggar Orynbassar
- 2026-09-23 12:58add team memberBolatkhan
- 2026-09-23 12:23docs: Add Onggar to README.md and setup gitignoreOnggar Orynbassar
- 2026-09-23 12:00docs: add team memberNagmetulla Temirlan
- 2026-09-23 16:32feat(frontend): upload 12 reports for two suppliersNagmetulla Temirlan
- 2026-09-23 16:01docs: remove links to live design docsNagmetulla Temirlan
- 2026-09-23 15:59feat(frontend): data upload screen and README with screenshotsNagmetulla Temirlan
- 2026-09-23 15:44feat(frontend): order plan UI on mock dataNagmetulla Temirlan
- 2026-09-23 14:33docs: SystemElectric procurement planner design and prototypeNagmetulla Temirlan
Структура репозитория (113 файлов)
.dockerignore .gitattributes .gitignore Dockerfile IDEA.md README.md build.gradle.kts design/Main.dc.html design/Risks.dc.html design/Settings.dc.html design/Sku.dc.html design/canvas.json docker-compose.yml docs/data_dictionary.md docs/design.md docs/excel_models.md docs/front data.txt docs/iek_fields.json docs/iek_fields.md docs/mvp_backend.md docs/order_calculation.md docs/systeme_fields.json docs/systeme_fields.md frontend/.dockerignore frontend/.env.example frontend/.gitignore frontend/.oxlintrc.json frontend/Dockerfile frontend/README.md frontend/docs/screenshots/error.png frontend/docs/screenshots/import-attach.png frontend/docs/screenshots/import-empty.png frontend/docs/screenshots/import-mobile.png frontend/docs/screenshots/import-partial.png frontend/docs/screenshots/import-result.png frontend/docs/screenshots/item.png frontend/docs/screenshots/plan.png frontend/index.html frontend/nginx.conf frontend/package-lock.json frontend/package.json frontend/public/favicon.svg frontend/public/mockServiceWorker.js frontend/src/App.tsx frontend/src/api/client.ts frontend/src/api/reports.ts frontend/src/api/types.ts frontend/src/components/ApproveDialog.tsx frontend/src/components/ItemDrawer.tsx frontend/src/components/OrderTable.tsx frontend/src/components/Sidebar.tsx frontend/src/components/States.tsx frontend/src/exportCsv.ts frontend/src/format.ts frontend/src/main.tsx frontend/src/mocks/browser.ts frontend/src/mocks/handlers.ts frontend/src/mocks/orders.json frontend/src/pages/ImportPage.tsx frontend/src/pages/PlanPage.tsx frontend/src/styles.css frontend/tsconfig.app.json frontend/tsconfig.json frontend/tsconfig.node.json frontend/vite.config.ts gradle/wrapper/gradle-wrapper.jar gradle/wrapper/gradle-wrapper.properties gradlew gradlew.bat prototype/order_prototype.py prototype/requirements.txt settings.gradle.kts src/main/kotlin/kz/hackalem/backend/BackendApplication.kt src/main/kotlin/kz/hackalem/backend/DemandForecastEngine.kt src/main/kotlin/kz/hackalem/backend/ExcelFileStore.kt src/main/kotlin/kz/hackalem/backend/ExcelReader.kt src/main/kotlin/kz/hackalem/backend/ExcelUploadController.kt src/main/kotlin/kz/hackalem/backend/IekData.kt src/main/kotlin/kz/hackalem/backend/IekExcelParser.kt src/main/kotlin/kz/hackalem/backend/IekOrderSource.kt src/main/kotlin/kz/hackalem/backend/OrderPlanningController.kt src/main/kotlin/kz/hackalem/backend/OrderPlanningData.kt src/main/kotlin/kz/hackalem/backend/OrderPlanningService.kt src/main/kotlin/kz/hackalem/backend/SaleAnomalyDetector.kt src/main/kotlin/kz/hackalem/backend/SystemeData.kt src/main/kotlin/kz/hackalem/backend/SystemeExcelParser.kt src/main/kotlin/kz/hackalem/backend/SystemeOrderSource.kt src/main/resources/application.properties src/test/kotlin/kz/hackalem/backend/DemandForecastEngineTests.kt src/test/kotlin/kz/hackalem/backend/ExcelFixtures.kt src/test/kotlin/kz/hackalem/backend/ExcelReaderTests.kt src/test/kotlin/kz/hackalem/backend/ExcelUploadTests.kt src/test/kotlin/kz/hackalem/backend/IekExcelParserTests.kt src/test/kotlin/kz/hackalem/backend/IekOrderSourceTests.kt src/test/kotlin/kz/hackalem/backend/OrderPlanningControllerTests.kt src/test/kotlin/kz/hackalem/backend/OrderPlanningServiceTests.kt src/test/kotlin/kz/hackalem/backend/SaleAnomalyDetectorTests.kt src/test/kotlin/kz/hackalem/backend/SourceWorkbooksTests.kt src/test/kotlin/kz/hackalem/backend/SystemeExcelParserTests.kt src/test/kotlin/kz/hackalem/backend/SystemeOrderSourceTests.kt src/test/resources/excel/iekIncomingShipments.xml src/test/resources/excel/iekMonthlySales.xml src/test/resources/excel/iekMonthlyStocks.xml src/test/resources/excel/iekMoq.xml src/test/resources/excel/iekSalesDynamics.xml src/test/resources/excel/iekSeasonality.xml src/test/resources/excel/systemeIncomingShipments.xml src/test/resources/excel/systemeMonthlySales.xml src/test/resources/excel/systemeMonthlyStocks.xml src/test/resources/excel/systemeMoq.xml src/test/resources/excel/systemeSalesDynamics.xml src/test/resources/excel/systemeSeasonality.xml task spec/HackAlem AI_ Автоматизация формирования заказов поставщикам.docx.pdf
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.

