food-market/src
nns fd2da58ad4 fix(products/update): merge barcodes/prices по ключу + 409 на concurrency
Юзер ловил 500 «DbUpdateConcurrencyException: 0 rows affected» при PUT
/api/catalog/products. RemoveRange(всех детей) + Add новых на каждом
сохранении генерирует массовый DELETE/INSERT, при котором EF ожидал N
rows affected, а реальный DELETE возвращал меньше — и весь батч падал
с 500.

Чиню по-человечески:
- Merge by stable key: barcodes по Code, prices по PriceTypeId.
  Совпавшие — обновляем поля, лишние удаляем, новые добавляем. Минимум
  записей в SaveChanges, минимум поводов для 0-affected.
- Catch DbUpdateConcurrencyException → 409 «Товар изменён в другом
  окне или сессии. Перезагрузите страницу и попробуйте снова.» вместо
  непрозрачного 500.
- Удалена мёртвая ветка `if (input.Vat is null) e.Vat = existingVat`:
  Apply уже не присваивает Vat при null, ничего восстанавливать не
  нужно.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 15:18:23 +05:00
..
food-market.api fix(products/update): merge barcodes/prices по ключу + 409 на concurrency 2026-04-25 15:18:23 +05:00
food-market.application feat(product): группа обязательна, ≥1 штрихкод, умные дефолты на новом 2026-04-25 11:24:10 +05:00
food-market.domain feat(org-settings): AllowFractionalPrices — переключатель дробных цен 2026-04-25 12:21:04 +05:00
food-market.infrastructure feat(barcode-uniqueness): pre-check на Create/Update + warnings импорта + admin endpoint 2026-04-25 12:26:20 +05:00
food-market.pos Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
food-market.pos.core Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
food-market.shared Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
food-market.web fix(money-input): toFixed(2) при allowFractional=true для правильного отображения 2026-04-25 12:55:33 +05:00