- C# 83.5%
- TypeScript 15%
- CSS 1.1%
- Dockerfile 0.2%
|
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
Reviewed-on: #9 |
||
|---|---|---|
| .context | ||
| .forgejo/workflows | ||
| ContractService | ||
| ContractService.Tests | ||
| ContractService.Web | ||
| .dockerignore | ||
| .gitignore | ||
| CLAUDE.md | ||
| ContractService.slnx | ||
| CONTRIBUTING.md | ||
| docker-compose.dev.yml | ||
| docker-compose.yml | ||
| README.md | ||
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)