# Миграция: Функционал пересчета цен в конфигураторе ## Описание изменений Добавлен функционал автоматического обновления цен компонентов в сохраненных конфигурациях. ### Новые возможности 1. **Кнопка "Пересчитать цену"** на странице конфигуратора - Обновляет цены всех компонентов в конфигурации до актуальных значений из базы данных - Сохраняет количество компонентов, обновляя только цены - Отображает время последнего обновления цен 2. **Поле `price_updated_at`** в таблице конфигураций - Хранит дату и время последнего обновления цен - Отображается на странице конфигуратора в удобном формате ("5 мин. назад", "2 ч. назад" и т.д.) ### Изменения в базе данных Добавлено новое поле в таблицу `qt_configurations`: ```sql ALTER TABLE qt_configurations ADD COLUMN price_updated_at TIMESTAMP NULL DEFAULT NULL AFTER server_count; ``` ### Новый API endpoint ``` POST /api/configs/:uuid/refresh-prices ``` **Требования:** - Авторизация: Bearer Token - Роль: editor или выше **Ответ:** ```json { "id": 1, "uuid": "...", "name": "Конфигурация 1", "items": [ { "lot_name": "CPU_AMD_9654", "quantity": 2, "unit_price": 11500.00 } ], "total_price": 23000.00, "price_updated_at": "2026-01-31T12:34:56Z", ... } ``` ## Применение изменений ### 1. Обновление базы данных Запустите сервер с флагом миграции: ```bash ./quoteforge -migrate -config config.yaml ``` Или выполните SQL миграцию вручную: ```bash mysql -u user -p RFQ_LOG < migrations/004_add_price_updated_at.sql ``` ### 2. Перезапуск сервера После применения миграции перезапустите сервер: ```bash ./quoteforge -config config.yaml ``` ## Использование 1. Откройте любую сохраненную конфигурацию в конфигураторе 2. Нажмите кнопку **"Пересчитать цену"** рядом с кнопкой "Сохранить" 3. Все цены компонентов будут обновлены до актуальных значений 4. Конфигурация автоматически сохраняется с обновленными ценами 5. Под кнопками отображается время последнего обновления цен ## Технические детали ### Измененные файлы - `internal/models/configuration.go` - добавлено поле `PriceUpdatedAt` - `internal/services/configuration.go` - добавлен метод `RefreshPrices()` - `internal/handlers/configuration.go` - добавлен обработчик `RefreshPrices()` - `cmd/qfs/main.go` - добавлен маршрут `/api/configs/:uuid/refresh-prices` - `web/templates/index.html` - добавлена кнопка и JavaScript функции - `migrations/004_add_price_updated_at.sql` - SQL миграция - `CLAUDE.md` - обновлена документация ### Логика обновления цен 1. Получение конфигурации по UUID 2. Проверка прав доступа (пользователь должен быть владельцем) 3. Для каждого компонента в конфигурации: - Получение актуальной цены из `qt_lot_metadata.current_price` - Обновление `unit_price` в items 4. Пересчет `total_price` с учетом `server_count` 5. Установка `price_updated_at` на текущее время 6. Сохранение конфигурации ### Обработка ошибок - Если компонент не найден или у него нет цены - сохраняется старая цена - При ошибках доступа возвращается 403 Forbidden - При отсутствии конфигурации возвращается 404 Not Found ## Отмена изменений (Rollback) Для отмены миграции выполните: ```sql ALTER TABLE qt_configurations DROP COLUMN price_updated_at; ``` **Внимание:** После отмены миграции функционал пересчета цен перестанет работать корректно.