Платформа за прозрачност на обществените поръчки. Публичен портал, който събира на едно място отворените данни за българските обществени поръчки от официалния регистър (ЦАИС ЕОП / АОП), свързва институции → договори → компании и прави всяка сума проследима до конкретния договор — кой, на кого, колко и с каква история. Отворени данни за граждани, журналисти и НПО.
Публичен портал: sigma.midt.bg · данни от 2020 г. до днес, с ежедневно обновяване от официалния регистър.
Обществените поръчки са сред най-големите разходи на държавата — милиарди левове всяка година. Доскоро да проследиш една поръчка изискваше експертиза и месеци ровене в стотици записи; СИГМА ги събира в свързана, търсима и сваляема картина, в която всеки тръгва от възложител или фирма и стига до конкретните договори.
Дизайнът и решенията живеят в docs/ — започнете оттам:
docs/architecture.md— преглед на системата и карта към решенията.docs/adr/— Architecture Decision Records (по едно решение на файл).docs/core-scope.md— доменен модел и речник на данните.docs/etl.md— ETL pipeline-ът и емисията от ЦАИС ЕОП.docs/deploy.md— деплой към Cloudflare.docs/spec/ai-assistant.md— спецификация на AI асистента (планиран).docs/README.md— пълен индекс на документацията, вкл. достъпност и стандартите за ревю.
Справочник само за четене върху три същности и връзките между тях:
- Институция — възложителят;
- Компания — получателят, с ключ ЕИК;
- Договор — сключеният договор;
плюс паричните потоци институция → компания и глобалното търсене, които свързват трите същности в един общ граф.
| Страница | Route | На какъв въпрос отговаря |
|---|---|---|
| Начало | / |
Обобщени суми + входни точки (най-големите възложители и получатели) |
| Институции | /authorities |
Всички възложители, с подреждане и филтри |
| Профил на институция | /authorities/[eik] |
Един възложител: колко, за какво, към кого |
| Компании | /companies |
Получателите; по подразбиране подредени по спечелена сума |
| Профил на компания | /companies/[eik] |
Един получател: общо спечелено, от кого, какво |
| Договори | /contracts |
Филтриран списък с договори |
| Детайл на договор | /contracts/[id] |
Една сделка с пълна проследимост до източника |
| Потоци | /flows |
Парични потоци възложител → компания (суми + брой) |
| Търсене | /search |
По имена, предмет и идентификатори |
Списъците имат CSV експорт (/contracts.csv, /companies.csv, /authorities.csv), всеки договор — JSON изглед (/contracts/[id].json). Има и страници за методология, достъпност, поверителност и impressum, плюс robots.txt и sitemap файлове.
Прозрачността върху публичните данни работи днес. Следващите стъпки надграждат същата структура, която вече ги предвижда, затова нищо не се преправя наново:
- Слой „собственици и свързани лица“ — пълно свързване с Търговския регистър.
- Автоматични проверки на задания, цени и картели, с публичен рисков индекс на всяка поръчка (зелено / жълто / червено) — с публична методология и отворен код.
- AI асистент на български — разговорен слой над данните (текст и глас): намира и обяснява поръчките и изготвя справки.
Освен контрол, целта е и да помага на малкия и средния бизнес да намира лесно подходящите за него поръчки. СИГМА е част от инициативите на МИДТ за прозрачност чрез отворени данни.
Хранилището е пригодено за разработка в Devcontainer — вашата машина се нуждае от Docker (или съвместим: OrbStack, Rancher Desktop) и редактор с поддръжка на Devcontainer (VS Code, JetBrains и др.).
# Отворете папката в редактора и "Reopen in Container"
# (или от CLI: `devcontainer up --workspace-folder .`)
pnpm setup # еднократно при ново сваляне: инсталиране + локален D1 + начални данни
pnpm dev # ежедневно: пуска приложението и ETL worker-а паралелноpnpm setup инсталира зависимостите, прилага D1 миграциите и зарежда малък примерен набор данни (scripts/seed.sql) в локалната miniflare база. pnpm dev стартира приложението на http://localhost:5173 и ETL worker-а на :8789. Пълният корпус се зарежда с pnpm run import — изисква свалената EOP емисия в data/eop (виж ETL).
Статус: прототип. Приложението и refresh worker-ът работят локално и се деплойват на Cloudflare през GitHub Actions; аналитичният слой (оценка на риска, аномалии, картели) е в плана за развитие.
СИГМА използва изпитан единен TypeScript monorepo (pnpm + turbo) върху edge платформата на Cloudflare. Днес продуктът използва Workers (React Router v7 SSR) + D1 + Cloudflare Workflows; останалите услуги на платформата (Durable Objects, Vectorize, Workers AI, Queues, KV, R2, AI Gateway) са на разположение за аналитичния слой.
| Директория | Съдържание |
|---|---|
apps/web |
Worker sigma — React Router v7 SSR приложение; чете D1 директно през @sigma/db |
apps/etl |
Worker sigma-etl — cron-only опресняване на данните (durable Workflow sigma-refresh) |
packages/ |
Споделени библиотеки — @sigma/db (схема, миграции, заявки), @sigma/ingest, @sigma/api-contract, @sigma/config, @sigma/shared |
scripts/ |
Bootstrap, setup, teardown, рендериране на wrangler конфига; зареждане на данни от ЦАИС ЕОП (load-eop.mjs, import.mjs, normalize-raw.sql и съпътстващите SQL стъпки) |
data/ |
Кешираната storage.eop.bg емисия под data/eop — ~192 хил. договора от 2020 г. насам; gitignored. Зарежда се в D1 от pipeline-а в scripts/ — виж docs/etl.md |
docs/ |
Спецификация и дизайн документи |
.devcontainer/ |
Контейнерна dev среда |
.github/workflows/ |
ci.yml — lint, typecheck, тестове, одит на зависимостите и сканиране за тайни при push и PR; deploy.yml — деплой при release tag (v* → production) или ръчно стартиране (staging/production) |
| Команда | Предназначение |
|---|---|
pnpm setup |
Първоначална настройка при ново сваляне (инсталиране + миграции + начални данни) |
pnpm dev |
Пуска приложението и ETL worker-а локално (miniflare) |
pnpm typecheck |
Проверка на типовете в целия проект |
pnpm test |
Пуска всички тестове |
pnpm lint / format |
Prettier проверка / форматиране |
pnpm run import |
Зарежда EOP емисията в локалния D1 и преизгражда производните таблици; --catchup сам изчислява прозореца за догонване. run е задължително; голото pnpm import е вградена pnpm команда |
pnpm bootstrap |
Пробно създаване на Cloudflare ресурсите (еднократно за Cloudflare профил); bootstrap:apply ги създава реално |
pnpm run deploy |
Деплой на двата Worker-а; в CI се пуска при release tag или ръчно. run е задължително; голото pnpm deploy е вградена pnpm команда |
pnpm teardown |
Изтрива локалното miniflare състояние (.wrangler на двата worker-а) |
Историческата база на ЦАИС ЕОП се зарежда от публичната EOP MinIO емисия с отворени данни: scripts/load-eop.mjs сваля и подготвя дневните bucket-и (по подразбиране пише SQL файлове и ги прилага само с --apply), а scripts/import.mjs прилага локалните D1 миграции, зарежда емисията и преизгражда производните таблици. Базовият адрес по подразбиране е https://storage.eop.bg и може да се подмени с EOP_OPEN_DATA_BASE_URL.
В production worker-ът sigma-etl опреснява базата на всеки 6 часа (cron 0 */6 * * *), като стартира durable Workflow sigma-refresh върху малък скорошен прозорец; големите догонвания остават за CLI-то (pnpm run import --catchup). Подробности — в docs/etl.md.
Production деплоите тръгват само от GitHub Actions (release tag или ръчно стартиране); машината за разработка никога не държи дълготрайни production данни за достъп. Данните за обществени поръчки са публични по дизайн, но интеграциите с национални регистри (НАП, Търговски регистър) носят ограничения за достъп — третирайте всички данни за достъп до тях като production тайни.
Лицензиран под MIT — виж LICENSE.