No description
  • C# 83.5%
  • TypeScript 15%
  • CSS 1.1%
  • Dockerfile 0.2%
Find a file
macoun fe33112beb
All checks were successful
Build and publish Docker image / migrations-check (push) Successful in 43s
Build and publish Docker image / frontend (push) Successful in 43s
Build and publish Docker image / test (push) Successful in 1m40s
Build and publish Docker image / build-and-push (push) Successful in 1m38s
Merge pull request 'feat(notifications): post contract state changes to a Teams channel' (#9) from feat/teams-channel-notifications into main
Reviewed-on: #9
2026-11-06 12:10:45 +00:00
.context fix(notifications): render user text in Teams cards without markdown 2026-11-06 13:05:49 +01:00
.forgejo/workflows chore(web): add ESLint and check the frontend in CI 2026-10-16 08:54:57 +02:00
ContractService fix(notifications): render user text in Teams cards without markdown 2026-11-06 13:05:49 +01:00
ContractService.Tests fix(notifications): render user text in Teams cards without markdown 2026-11-06 13:05:49 +01:00
ContractService.Web feat(web): add a favicon that sets the tracker apart from the portal 2026-10-16 16:10:44 +02:00
.dockerignore feat: add web frontend with portal login and My Work screen 2026-09-29 15:22:30 +02:00
.gitignore feat: persistence a identita - EF Core/SQLite, portalova autentizace, role (M2) 2026-09-24 13:06:12 +02:00
CLAUDE.md refactor: drop interfaces that have a single implementation 2026-10-15 15:58:28 +02:00
ContractService.slnx chore: kostra repa podle vzoru chester-microservice (M0) 2026-09-22 16:18:07 +02:00
CONTRIBUTING.md docs: add a contributor guide for whoever takes over the app 2026-10-16 08:55:58 +02:00
docker-compose.dev.yml fix(security): rate-limit anonymous paths and stop forwarding junk tokens to the portal 2026-10-15 14:29:35 +02:00
docker-compose.yml feat(notifications): post contract state changes to a Teams channel 2026-11-06 12:56:59 +01:00
README.md feat(notifications): post contract state changes to a Teams channel 2026-11-06 12:56:59 +01:00

Zakázky (ContractService)

Interní tracker zakázek STATOTEST — přehled, v jakém stavu je která zakázka, a úkolníček, aby každý věděl, co je na něm. Zakázka tu prochází celým cyklem od telefonátu po předání zákazníkovi; teprve pak jsou data dost krystalizovaná pro hlavní portál.

  • Backend: .NET 10, ASP.NET Core, EF Core + SQLite
  • Frontend: React 19 + Vite + TypeScript + CoreUI, servíruje ho tentýž kontejner
  • Přihlášení: portálovým účtem (api.statotest.com); dovnitř pustí jen GlobalAdmin
  • Přebíráte vývoj? Začněte CONTRIBUTING.md — jak se tu pracuje a jak přidat novou věc
  • Pravidla pro vývoj: CLAUDE.md · dokumentace: .context/

Jak se s tím pracuje

Koncept → Kontrola vedení → Určený k výrobě → Ve výrobě → Sestaveno → Ready → Předáno
Role Co dělá
Obchod založí zakázku po telefonu — firma z portálu, název, co se bude stavět — a pošle ji ke kontrole
Vedení doplní konfiguraci (krabice, GPS/LTE/WiFi/LoRa, volné parametry), přiřadí výrobu, schválí k výrobě; po sestavení akceptuje
Výroba zahájí výrobu, vytiskne průvodku, potvrdí dokončení
Obchod (zakladatel) předá zákazníkovi → zakázka odchází do archivu
Vývoj zakázkou neposouvá, ale úkolem ji zastaví, dokud nedodělá software

Pátá role, Montáž (zapojení u zákazníka), zatím ve flow vlastní krok nemá.

Na každé zakázce je vidět, kdo je na tahu a co má udělat; domovská obrazovka „Moje práce“ ukazuje, co čeká na vás. Kdo narazí na nejasnost, položí dotaz nebo zadá úkol — zaškrtnutý zakázku zastaví, dokud ho někdo nevyřídí. Při prvním přihlášení provede aplikaci krátký průvodce (tlačítko „Průvodce“ v hlavičce ho pustí znovu).

Uvnitř smí každý všechno (ADR-011) — role jsou nálepky pro směrování práce, ne oprávnění. Co platí vždycky, jsou pravidla o úplnosti: bez konfigurace a přiřazené výroby se neschvaluje, s otevřeným blokujícím dotazem či úkolem se nedokončuje ani neakceptuje. Podrobně v .context/contract-flow.md a .context/user-stories.md.

Spuštění lokálně

Potřebuješ .NET 10 SDK a Node 24.

# 1) backend - http://localhost:5145, Swagger na /swagger
cd ContractService
dotnet run

# 2) frontend - http://localhost:5180, /api proxuje na backend
cd ContractService.Web
npm install
npm run dev

Otevři http://localhost:5180 a přihlas se svým portálovým e-mailem a heslem. Přihlášení jde přes nás na portál (/v2/Accounts/authenticate) — do portálu se nic nezapisuje. Bez role GlobalAdmin dostaneš 403; člen týmu se ti založí sám při prvním přihlášení.

Databáze (contracts.db), přílohy a zálohy vzniknou v ContractService/, migrace proběhnou při startu. Prázdná databáze se v Development naplní ukázkovými zakázkami — prochází flow enginem, takže dodržují stejná pravidla jako skutečná data. Vypnout je jde přes DemoData__Enabled=false (na dev serveru vypnuté).

Testy

dotnet build      # warnings jsou errors
dotnet test       # vč. celého cyklu zakázky jako čtyři různí lidé (HappyPathTests)

Frontend: npx tsc --noEmit a npm run build v ContractService.Web. Po změně API přegeneruj typy s běžícím backendem: npm run api (→ src/api/schema.d.ts, commitnout). Po změně závislostí generuj package-lock.json npm z node:24-alpine (návod v .context/frontend.md) — jinak spadne build image.

Jak se pracuje

Práce jde do větve a do main přes pull request na Forgeju. Na PR běží testy a kontrola, že model sedí na migrace; image se staví až po merge. Proces zakázky (stavy, přechody, pravidla) se mění jen migrací seedu — pravidla v CLAUDE.md.

Kde to běží

Dev Produkce
Server (Portainer) LISTER-DEVELOP_SERVER RIMMER-DATA
Adresa http://192.168.88.33:5089 contracts.statotest.com → NPM → 192.168.88.23:5090
Compose docker-compose.dev.yml docker-compose.yml
Notifikace DryRun — jen se logují e-mail přes Office 365

Image git.statotest.com/statotest/contract-service staví CI po každém pushi na main, tedy po merge PR (backend i frontend v jednom image). Nasazení = v Portaineru Update the stack s re-pullem. Pozor: Portainer drží vlastní kopii compose — změna compose v gitu se tam musí přepsat ručně. Deploy, rollback a obnova zálohy: .context/operations.md.

Vždycky jen jedna replika — SQLite s jedním WAL souborem a víc instancí = poškozená data.

Co kde je

ContractService/          backend (API + servíruje build frontendu z wwwroot)
ContractService.Web/      frontend (React)
ContractService.Tests/    xUnit - integrační testy nad dočasnou SQLite
.context/                 dokumentace: architektura, flow, rozhodnutí (ADR), runbook
.forgejo/workflows/       CI - testy a kontrola migrací (PR i main), build a push image (jen main)

Podrobná mapa souborů: .context/codebase-map.md.

Co ještě chybí

  • vložení do portálu přes iframe — na straně portálu (.context/frontend.md)
  • počty zakázek po stavech (deska se sloupci)