From cea979e3273a1861b0b6d1f6b826512294f14ca7 Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Thu, 25 Jun 2026 10:13:57 +0300 Subject: [PATCH] docs: release notes v2.21 Co-Authored-By: Claude Sonnet 4.6 --- releases/v2.21/RELEASE_NOTES.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 releases/v2.21/RELEASE_NOTES.md diff --git a/releases/v2.21/RELEASE_NOTES.md b/releases/v2.21/RELEASE_NOTES.md new file mode 100644 index 0000000..35af358 --- /dev/null +++ b/releases/v2.21/RELEASE_NOTES.md @@ -0,0 +1,27 @@ +# QuoteForge v2.21 + +Дата релиза: 2026-06-25 +Тег: `v2.21` + +## Что нового + +### Исправление: сбой синхронизации при дублях lot_name в прайслисте + +При загрузке нового прайслиста (W-2026-06-25-001) синхронизация прерывалась с ошибкой `UNIQUE constraint failed: local_pricelist_items.pricelist_id, local_pricelist_items.lot_name` — в серверной таблице `qt_pricelist_items` оказались дубли `lot_name` для одного прайслиста. QF теперь дедуплицирует позиции при загрузке и пропускает повторные вхождения с предупреждением в лог. + +### Исправление: race condition при параллельном запуске синхронизации + +Если фоновый тикер и ручной запуск «Синхронизировать» срабатывали одновременно, оба потока пытались записать items в одну таблицу, что приводило к UNIQUE constraint ошибке. `SyncPricelists()` теперь защищена тем же мьютексом, что и фоновый `SyncPricelistsIfNeeded()`. + +### Улучшение: ошибки отправки изменений попадают в лог синхронизации + +`PushPendingChanges` теперь записывает результат в `sync_log` (тип `changes`) — ошибки отправки конфигураций и проектов на сервер видны в диалоге «Информация о синхронизации» и в support bundle. + +### Улучшение: состояние клиента всегда отправляется на сервер после синхронизации + +`reportClientSchemaState` теперь вызывается по завершении синхронизации через `defer` — актуальное состояние (включая ошибки) уходит на сервер независимо от того, завершился sync успехом или сбоем. + +## Запуск на macOS + +Снимите карантинный атрибут через терминал: `xattr -d com.apple.quarantine /path/to/qfs-darwin-arm64` +После этого бинарник запустится без предупреждения Gatekeeper.