Files
QuoteForge/MIGRATION_PRICE_REFRESH.md
Michael Chus f31ae69233 Add price refresh functionality to configurator
- Add price_updated_at field to qt_configurations table to track when prices were last updated
- Add RefreshPrices() method in configuration service to update all component prices with current values from database
- Add POST /api/configs/:uuid/refresh-prices API endpoint for price updates
- Add "Refresh Prices" button in configurator UI next to Save button
- Display last price update timestamp in human-readable format (e.g., "5 min ago", "2 hours ago")
- Create migration 004_add_price_updated_at.sql for database schema update
- Update CLAUDE.md documentation with new API endpoint and schema changes
- Add MIGRATION_PRICE_REFRESH.md with detailed migration instructions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 10:31:00 +03:00

4.9 KiB
Raw Blame History

Миграция: Функционал пересчета цен в конфигураторе

Описание изменений

Добавлен функционал автоматического обновления цен компонентов в сохраненных конфигурациях.

Новые возможности

  1. Кнопка "Пересчитать цену" на странице конфигуратора

    • Обновляет цены всех компонентов в конфигурации до актуальных значений из базы данных
    • Сохраняет количество компонентов, обновляя только цены
    • Отображает время последнего обновления цен
  2. Поле price_updated_at в таблице конфигураций

    • Хранит дату и время последнего обновления цен
    • Отображается на странице конфигуратора в удобном формате ("5 мин. назад", "2 ч. назад" и т.д.)

Изменения в базе данных

Добавлено новое поле в таблицу qt_configurations:

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 или выше

Ответ:

{
  "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. Обновление базы данных

Запустите сервер с флагом миграции:

./quoteforge -migrate -config config.yaml

Или выполните SQL миграцию вручную:

mysql -u user -p RFQ_LOG < migrations/004_add_price_updated_at.sql

2. Перезапуск сервера

После применения миграции перезапустите сервер:

./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/server/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)

Для отмены миграции выполните:

ALTER TABLE qt_configurations DROP COLUMN price_updated_at;

Внимание: После отмены миграции функционал пересчета цен перестанет работать корректно.