Find a file
nns 6940aa40df
Some checks failed
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Has been cancelled
Docker Web / Deploy Web on stage (push) Has been cancelled
feat(s19): bulk-операции + presets + power-user UX (7 пунктов)
1. Bulk-обновление товаров — Product.IsArchived + IsAvailableForSale
   (Phase19a миграция), POST /api/catalog/products/bulk-update {ids, op, params}
   с операциями price-adjust (% / абсолют), change-group, archive/unarchive,
   toggle-sale. Одной транзакцией, multi-tenant через query-filter.
   Frontend: checkbox-колонка, sticky bulk-bar, модалка.

2. SavedPresets — domain UserPreset (Phase19b: jsonb ConfigJson,
   unique по OrgId+UserId+PageKey+Name). /api/user/presets CRUD per-user.
   <SavedPresets> компонент с chip-bar и сохранением. Применено к /reports/
   sales/stock/profit + /catalog/products.

3. QuickActionsPalette — Cmd+J открывает отдельную палитру с 14 действиями
   + история topa-10 в localStorage.fm.quickActions.recent. ↑↓/Enter/Esc
   keyboard nav. Cmd+K (поиск) и Cmd+J (действия) — разные палитры.

4. Inline-edit цены — PATCH /api/catalog/products/{id}/price новый endpoint
   с RoundIfNeeded. <InlinePriceCell> с dblclick → input, optimistic update
   + revert при ошибке.

5. CSV import товаров — POST /api/catalog/products/import-csv (rows[]).
   Клиент парсит CSV (auto-detect разделитель ,/;), сервер commit'ит
   транзакцией. autoCreateGroup для новых групп. <ProductsCsvImport>
   модалка с preview и подсветкой ошибочных строк.

6. CSV/XLSX export — endpoint'ы /export на 5 контроллерах (products,
   counterparties, stock, retail-sales, supplies). Reuse существующего
   ReportExport.Csv/Xlsx. <ExportButton> dropdown с двумя форматами.

7. Keyboard-first nav в DataTable — ↑↓/Home/End/Enter/Space/Delete props
   keyboardNav/onSelect/onDelete. Подсветка focused-строки. Документация
   в src/help/keyboard-shortcuts.md + 2 новые HelpTopic'a.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 21:08:48 +05:00
.claude feat(returns): возврат от покупателя (CustomerReturn) (P1-6) 2026-05-28 09:51:04 +05:00
.forgejo/workflows test(s16): regression suite 35 flows + visual 60 snapshots + nightly + CI badges 2026-06-07 16:14:11 +05:00
.github/workflows.disabled ci: disable .github/workflows — Forgejo Actions is the primary CI now 2026-04-23 17:10:22 +05:00
assets/brand chore(brand): add new food-market logo source SVG (FOOD/MARKET wordmark с яблоком) 2026-05-02 00:19:46 +05:00
badges test(s16): regression suite 35 flows + visual 60 snapshots + nightly + CI badges 2026-06-07 16:14:11 +05:00
deploy feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00
docs feat(s19): bulk-операции + presets + power-user UX (7 пунктов) 2026-06-07 21:08:48 +05:00
scripts feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00
src feat(s19): bulk-операции + presets + power-user UX (7 пунктов) 2026-06-07 21:08:48 +05:00
tests feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00
.editorconfig Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
.gitattributes Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
.gitignore feat(public): Phase 6 — публичный маркетинговый сайт food-market.public на Astro 2026-04-26 19:11:34 +05:00
.nvmrc Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
CHANGELOG.md feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00
CLAUDE.md Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
Directory.Build.props Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
Directory.Packages.props perf(s14): индексы + N+1 fix + bundle -50% + WebP variants + pool + Hangfire timing 2026-06-07 13:21:39 +05:00
food-market.sln test(integration): Testcontainers.PostgreSql + WebApplicationFactory, 10 тестов (P1-21) 2026-05-27 03:14:01 +05:00
global.json Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
README.md test(s16): regression suite 35 flows + visual 60 snapshots + nightly + CI badges 2026-06-07 16:14:11 +05:00

food-market

CI Docker API Stage verify Regression coverage

Аналог системы МойСклад для розничной торговли в Казахстане.

Состав системы

  • Сервер (ASP.NET Core 8 + PostgreSQL) — мультитенантный API, web-админка на React
  • Web-админка (React 18 + Vite + shadcn/ui) — управление магазином, справочниками, документами, отчётами
  • Кассовая программа (WPF на .NET 8) — офлайн-работоспособная касса для Windows 10+, синхронизируется с сервером, работает с весами (Масса-К в первую очередь)

Структура репозитория

food-market/
├── src/
│   ├── food-market.domain/          # доменные сущности, enum'ы, события
│   ├── food-market.application/     # use cases (MediatR), DTO, интерфейсы
│   ├── food-market.infrastructure/  # EF Core, PostgreSQL, внешние сервисы
│   ├── food-market.api/             # ASP.NET Core + OpenIddict + SignalR
│   ├── food-market.web/             # React + Vite + shadcn/ui (SPA)
│   ├── food-market.shared/          # DTO-контракты сервер ↔ POS
│   ├── food-market.pos.core/        # логика POS (независима от UI)
│   └── food-market.pos/             # WPF + .NET 8 кассовая программа
├── tests/
├── deploy/
│   ├── docker-compose.yml           # PostgreSQL для локальной разработки
│   └── Dockerfile.api
└── docs/

Именование

  • Папки, проекты, csproj, docker-образы, URL — lowercase: food-market, food-market.api
  • C# namespacefoodmarket.Api, foodmarket.Domain (lowercase root; C# не допускает дефис в идентификаторах)
  • Отображаемое имя в UI — "Food Market"

Стек

Сервер

  • .NET 8 LTS (до ноября 2026), ASP.NET Core Minimal APIs + Controllers
  • EF Core 8 + Npgsql + PostgreSQL 16
  • OpenIddict 5 (OAuth2/OIDC — password + refresh tokens)
  • MediatR + FluentValidation (CQRS-lite)
  • SignalR (real-time синхронизация)
  • Hangfire (фоновые задачи)
  • Serilog (структурированное логирование)

Web

  • React 18 + Vite + TypeScript
  • shadcn/ui + Tailwind CSS
  • TanStack Query + TanStack Table
  • AG Grid Community (для тяжёлых grid'ов)
  • Recharts / Tremor (графики)
  • react-hook-form + Zod

POS

  • .NET 8 WPF, Windows 10+
  • CommunityToolkit.Mvvm (source-generated MVVM)
  • SQLite (локальная БД)
  • Refit + Polly (API-клиент с retry)
  • System.IO.Ports (драйверы весов: Масса-К и др.)

Мультитенантность

Каждая сущность имеет OrganizationId. Пользователь scoped к организации. EF Core query filter автоматически изолирует данные между тенантами.

Локальная разработка

# Поднять PostgreSQL
cd deploy && docker compose up -d

# Мигрировать БД
cd src/food-market.api && dotnet ef database update

# Запустить API
dotnet run --project src/food-market.api

# Запустить Web
cd src/food-market.web && pnpm install && pnpm dev

Статус

🚧 Phase 0: фундамент (scaffolding, auth, multi-tenancy)