Проблема: на свежей 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>