Каждый из 26 спринтов работал в изоляции; этот спринт проверяет
взаимодействие — реально ли все фичи совместимы.
1. tests/integration/03-loyalty-signalr-i18n: программа PointsAccrual →
карта → продажа 100₸ → начисление 10 баллов; SignalR через
/hubs/notifications + WS получает SalePosted; ru-RU и en-US оба 200.
2. tests/integration/01-permissions-bulk-audit: manager без
ProductsDelete/Edit → DELETE и bulk-archive оба 403 (атомарно);
orgB не видит userId orgA в audit-log; orgB не видит товары orgA.
3. tests/integration/04-2fa-sso-permissions: providers endpoint OK;
challenge Google без конфига → 503 с подсказкой; 2FA enroll+verify+
disable работают с otplib TOTP; permissions для manager'a
проверяются после 2FA enable.
4. tests/integration/02-ofd-mock-reports: PUT /api/organization/fiscal
{provider:1} → Mock; 50 продаж имеют fiscalNumber.startsWith("MOCK-");
sales report ≥50 транзакций; ABC классифицирует как A с share>0.5.
5. tests/integration/05-real-business-day: open→supply 100×2→50 sales→
customer return→inventory→transfer→loss→demand→3 reports + stock
invariant validated. Прогон 24.7s.
6. tests/load/soak-4h.js + monitor-soak.sh — k6 constant-arrival-rate
50 RPS. Soak-lite 16m34s @ 20 RPS: 19863 iterations, 0 failures,
p95 me=16.9ms / products=29.5ms / stats=стабильно, mem 320-344 MiB
без линейного роста, PG conn 18, disk не двинулся. Без утечек.
7. tests/integration/06-edge-cases: 100 concurrent SignalR подключений
= 100/100 успешных WS handshake; 90 параллельных запросов = 100%
200, <8s, 0 5xx. Hangfire workers=2 не блокирует API.
8. Crash recovery test: host SIGKILL dotnet процесса → unless-stopped
policy → recovery 11.7s ≤ 30s SLA. Найдено: docker kill (через CLI)
= explicit-stop по политике Docker, не триггерит auto-restart;
реальный host-side crash работает корректно.
Cert-прогон: 7 integration specs все зелёные за 1.2 мин.
0 production bugs found.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
||
|---|---|---|
| .claude | ||
| .forgejo/workflows | ||
| .github/workflows.disabled | ||
| assets/brand | ||
| badges | ||
| deploy | ||
| docs | ||
| scripts | ||
| src | ||
| tests | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .nvmrc | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| Directory.Build.props | ||
| Directory.Packages.props | ||
| food-market.sln | ||
| global.json | ||
| README.md | ||
food-market
🟢 **Quality:** [`docs/quality-status.md`](docs/quality-status.md)Аналог системы МойСклад для розничной торговли в Казахстане. Multi-tenant SaaS + web-админка + Windows-касса. Поддерживает 8 типов документов учёта, ОФД-интеграцию (scaffolding), кассу на POS WPF с offline-буфером, отчёты, loyalty-programs, MoySklad-импорт, GDPR-export.
Состав
| Часть | Технологии | Точка входа |
|---|---|---|
| API | .NET 8 LTS, ASP.NET Core, EF Core 8, PostgreSQL 16, OpenIddict 5 | src/food-market.api → http://localhost:5081 |
| Web-админка | React 19, Vite, TypeScript, Tailwind v4, TanStack Query, AG Grid | src/food-market.web → http://localhost:5173 |
| Public marketing | Astro 5, TypeScript, Tailwind | src/food-market.public → http://localhost:4321 |
| POS-касса | WPF .NET 8 Windows, SQLite, Refit+Polly, COM-весы | src/food-market.pos (сборка кроссплатформенно, UI — Windows) |
5-минутный quick start
git clone http://192.168.1.193:3000/nns/food-market.git
cd food-market
# БД (Postgres 14+ должен быть запущен, default user)
createdb -U $USER food_market
# Backend (миграции применятся на старте; Swagger на /swagger)
ASPNETCORE_ENVIRONMENT=Development dotnet run --project src/food-market.api &
# Web SPA
cd src/food-market.web && pnpm install && pnpm dev &
# Зарегистрироваться + получить токен
curl -X POST http://localhost:5081/api/auth/signup \
-H "Content-Type: application/json" \
-d '{"organizationName":"Dev","email":"dev@local.test","password":"DevPass1!","phone":"+77001234567"}'
curl -X POST http://localhost:5081/connect/token \
-d 'grant_type=password&username=dev@local.test&password=DevPass1!&client_id=food-market-web&scope=openid profile email roles api offline_access'
# Открыть http://localhost:5173 → залогиниться dev@local.test / DevPass1!
Подробнее — docs/ONBOARDING.md.
Где что лежит
food-market/
├── src/
│ ├── food-market.domain/ # POCO + enum'ы + interfaces. Без EF / ASP.NET.
│ ├── food-market.application/ # DTO, FluentValidation, MediatR-handler'ы, Mapster.
│ ├── food-market.infrastructure/ # EF Core, миграции, Identity, OpenIddict storage.
│ ├── food-market.api/ # Controllers (60), middleware, Hangfire jobs (10 recurring), OpenIddict server.
│ ├── food-market.web/ # React 19 SPA админки.
│ ├── food-market.public/ # Astro marketing-сайт.
│ ├── food-market.shared/ # DTO-контракты сервер↔POS.
│ ├── food-market.pos.core/ # POS-логика (UI-agnostic).
│ └── food-market.pos/ # WPF (.NET 8 Windows).
├── tests/
│ ├── food-market.UnitTests/ # xUnit + InMemory EF.
│ ├── food-market.IntegrationTests/# xUnit + Testcontainers Postgres.
│ ├── e2e/ # Playwright + ad-hoc Python smoke.
│ └── load/ # k6 (нагрузочные).
├── deploy/ # Dockerfile.{api,web,public}, compose, nginx, prod-toolchain.
├── docs/ # 50+ markdown файлов.
└── food-market.sln
Ключевая документация
- ARCHITECTURE.md — общая картина: слои, deployment, что реализовано / scaffolding / не реализовано.
- ONBOARDING.md — first 3 days для нового разработчика.
- glossary.md — все доменные термины с ссылками на код.
- MULTI-TENANCY.md — как изолируются org'и.
- api-reference.md — auto-generated список всех 195 endpoint'ов.
- error-codes.md — каталог HTTP-кодов для humanizeError на фронте.
- secrets.md — env-vars + где хранятся секреты.
- RUNBOOK.md — операционные процедуры (что делать при инциденте).
- performance-baseline.md — k6 цифры + bottleneck'и.
Мультитенантность
Один процесс API обслуживает много организаций. Каждая видит только свои
данные через EF Core query-filter по OrganizationId. SuperAdmin роль
видит всё. См. MULTI-TENANCY.md.
Деплой
- Stage:
https://test.admin.food-market.kz. Деплой одной командой:~/deploy-stage.sh # docker build api+web → push в local registry → ssh prod-vm → compose up -d - Prod:
https://admin.food-market.kz. Toolchain готов (Sprint 21):
Реальный prod-сервер пока не настроен (DNS / certbot / nginx upstream).deploy/check-prod-readiness.sh # backup+disk+health+env deploy/prod-deploy.sh <api-tag> <web-tag> # blue-green deploy/prod-rollback.sh <to-tag> # быстрый откат deploy/post-deploy-smoke.sh # 10 шагов smoke + Telegram alert
Sprint-история (что было сделано)
Хронология в docs/sprintNN-progress.md. По состоянию на Sprint 24:
- 1-7 — фундамент: auth (OpenIddict), multi-tenancy, каталог, документы, кассы.
- 8-10 — отчёты, dashboard, dark mode + Cmd+K.
- 11 — ОФД scaffolding (Webkassa / Kassa24 / ОФД-Соло).
- 12-13 — документация / runbook / k6, security headers + rate-limits.
- 14-15 — performance (bundle −51%, индексы, N+1 fix), a11y (WCAG-AA).
- 16-17 — regression suite (44 Playwright specs), onboarding wizard + help.
- 18 — TODO cleanup (P0 race, audit filters, notification center).
- 19 — power UX (bulk-update, presets, Cmd+J, inline-edit, CSV import/export, keyboard nav).
- 20 — Mapster + SSO scaffold + maintenance jobs (cleanup, VACUUM, disk-monitor, perf-regression).
- 21 — stage→prod toolchain (7 deploy-скриптов + auto-tag).
- 22 — data tooling: GDPR-export, 1C-CSV import, anonymize-prod, DB-schema docs, audit export streaming.
- 23 — adversarial bug-hunt (4 bugs found + 4 fixed, includes CRITICAL 40001→500 fix).
- 24 — docs cross-check + auto-generated API reference + ONBOARDING + integration-test gap-fill.
Лицензия
Internal proprietary, не для публикации без разрешения владельца.