Find a file
nns a06464baeb fix(migrations): чиним P0-блокеры разворачивания на чистой БД
Проблема: на свежей PostgreSQL `dotnet ef database update` падает на пяти
миграциях подряд + рантайм-несовместимость схемы с domain Product/Store/
Counterparty. Невозможно поднять стек ни на dev, ни на новом стейдже.

Найдено и починено:

1. Phase2c4_ReconcileStage пыталась AddColumn IsMarked, который Phase1Catalog
   (после рефакторинга) уже добавляет. Завернули в IF NOT EXISTS.

2. Phase5d_ProductVatDecimal ALTER COLUMN products.Vat падал — Vat теперь
   заменён на FK VatRateId, колонки нет. Завернули в IF EXISTS.

3. Phase5c_UnitsOfMeasureGlobal INSERT канонических ОКЕИ пропускал NOT NULL
   колонку Symbol (а также DecimalPlaces, IsBase, CreatedAt). Дополнили
   полным набором: шт/кг/л/м/уп.

4. Phase5d_DropUnitOfMeasureDescription дропала несуществующую колонку
   (Description в новой схеме отсутствует). Завернули в IF EXISTS.

5. Phase5a_EmployeeSoftDelete и Phase5b_PlatformSettings были написаны
   вручную без атрибутов [Migration] + [DbContext] — EF их игнорировал
   и пропускал применение (см. memory/feedback_ef_migrations.md).
   Добавили атрибуты + сделали идемпотентными.

6. Новая Phase5f_DropStoreKindRudiment: rudimentные колонки stores.Kind и
   counterparties.Kind (NOT NULL без default'а) роняли любой INSERT —
   ни одной организации/контрагента создать нельзя. Дропаем.

7. Новая Phase5g_ProductVatRealign: приводим products в соответствие с
   domain — дропаем FK→vat_rates + колонку VatRateId + IsAlcohol + пустую
   таблицу vat_rates; добавляем products.Vat numeric(5,2) DEFAULT 12 и
   VatEnabled bool DEFAULT true. Без этого ProductsController падает 42703
   при создании любого товара.

Все миграции идемпотентны (DO $$ ... IF EXISTS/NOT EXISTS ...) — повторное
применение на старой стейдж-БД безопасно.

Проверено: E2E full-cycle на свежей dev-БД проходит 12/12 шагов.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 12:13:19 +05:00
.claude feat: strict OtherSystem schema — реплика потерянного f7087e9 2026-04-23 17:32:02 +05:00
.forgejo/workflows fix(ci): docker-public — актуализировать PUBLIC_*_URL под новые домены 2026-05-02 22:27:26 +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
deploy fix(docker): обновить node:20-alpine → 22-alpine (pnpm 11 требует Node ≥22) 2026-05-18 12:56:12 +05:00
docs docs: ТЗ на доработку и тестирование (полный аудит 2026-05-22) 2026-05-22 15:30:04 +05:00
src fix(migrations): чиним P0-блокеры разворачивания на чистой БД 2026-05-23 12:13:19 +05:00
tests/e2e e2e: bugs-fixed отчёт — все 12 шагов зелёные после fix HIGH+MEDIUM+2 gap'а 2026-05-08 12:16:17 +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
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 feat(platform): IEmailSender + MailKit + PlatformSettingsController 2026-05-06 12:39:18 +05:00
food-market.sln Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
global.json Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
README.md Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00

food-market

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

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

  • Сервер (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)