feat: вкладка Аренда — колонки Estimate/Цена продажи; lot_description для прайслистов

Вкладка «Аренда»: добавлены колонки Estimate и Цена продажи (+ итоги),
чекбокс «БУ» перенесён первым слева, таблица переведена на тот же
разметку/классы, что и таблицы вкладки «Ценообразование».

Прайслисты: local_pricelist_items получает lot_description (синхронизируется
из qt_pricelist_items.lot_description) вместо устаревших available_qty/
partnumbers, которые нигде не заполнялись.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Chusavitin
2026-07-22 15:11:06 +03:00
co-authored by Claude Sonnet 5
parent 7edb80e498
commit 39e6fd5642
15 changed files with 236 additions and 130 deletions
@@ -0,0 +1,17 @@
-- Tables affected: qt_pricelist_items
-- recovery.not-started: safe to re-run; ADD COLUMN IF NOT EXISTS
-- recovery.partial: ALTER TABLE qt_pricelist_items DROP COLUMN lot_description;
-- recovery.completed: no action needed
-- verify: lot_description column missing | SELECT 1 FROM information_schema.COLUMNS WHERE table_schema=DATABASE() AND table_name='qt_pricelist_items' AND column_name='lot_description' HAVING COUNT(*)=0
-- QuoteForge previously read a LOT's description via a per-row live join into
-- `lot` (internal/repository/pricelist.go GetItems), which never made it into
-- the local sync cache. Storing the description directly on the pricelist row
-- lets QF sync it like any other pricelist field and removes the join.
ALTER TABLE qt_pricelist_items
ADD COLUMN IF NOT EXISTS lot_description VARCHAR(10000) NULL;
UPDATE qt_pricelist_items i
JOIN lot l ON l.lot_name = i.lot_name
SET i.lot_description = l.lot_description
WHERE i.lot_description IS NULL OR i.lot_description = '';