• v1.3.2 cc9b846c31

    Release v1.3.2 Pre-Release

    mchus released this 2026-02-19 18:48:01 +03:00 | 199 commits to main since this release

    Summary

    Release focuses on stability and data integrity for local configurations. Added configuration revision history, stronger recovery for broken local sync/version states, improved sync self-healing, and clearer API error logging.

    Changes

    Configuration Revisions

    • Added full local configuration revision flow with storage and UI support.
    • Introduced revisions page/template and backend plumbing for browsing revisions.
    • Prevented duplicate revisions when content did not actually change.

    Local Data Integrity and Recovery

    • Added migration and snapshot support for local configuration version data.
    • Hardened updates for legacy/orphaned configuration rows:
      • allow update when project UUID is unchanged even if referenced project is missing locally;
      • recover gracefully when current_version_id is stale or version rows are missing.
    • Added regression tests for orphan-project and missing-current-version scenarios.

    Sync Reliability

    • Added smart self-healing path for sync errors.
    • Fixed duplicate-project sync edge cases.

    API and Logging

    • Improved HTTP error mapping for configuration updates (404/403 instead of generic 500 in known cases).
    • Enhanced request logger to capture error responses (status, response body snippet, gin errors) for failed requests.

    UI and Export

    • Updated project detail and index templates for revisions and related UX improvements.
    • Updated export pipeline and tests to align with revisions/project behavior changes.

    Breaking Changes

    None identified.

    Downloads
  • v1.3.1 9b5d57902d

    Changes since v1.3.0: Pre-Release

    mchus released this 2026-02-13 19:33:16 +03:00 | 207 commits to main since this release

    Release Notes — v1.3.1

    Что нового

    1. Проекты: добавлены code и variant (уникальность по связке), name стал необязательным.
    2. UI проектов: обновлена таблица, кликабельные коды/варианты, новый вариант через кнопку.
    3. Breadcrumbs: единый стиль, кликабельные переходы и домик “все проекты”.
    4. Квотатор: навигация по проектам/вариантам через breadcrumbs.

    Миграции и совместимость

    1. Добавлены миграции для code, variant и nullable name в MariaDB и SQLite.
    2. Перезагрузка локальной БД теперь не сбрасывает параметры подключения.
    3. Дедупликация проектов по code в интерфейсе и улучшенная синхронизация вариантов.

    Исправления и улучшения

    1. Корректная обработка NULL name в UI и API.
    2. Стабильное формирование кодов/вариантов и уникальность на уровне БД.
    3. Улучшенные элементы интерфейса (варианты в виде чипов, клики по ним).
    Downloads
  • v1.3.0 e58fd35ee4

    mchus released this 2026-02-11 19:24:25 +03:00 | 213 commits to main since this release

    Summary

    Introduced article generation with pricelist categories, added local configuration storage, and expanded sync/export capabilities. Simplified article generator compression and loosened project update constraints.

    Changes

    Main Features: Articles + Pricelist Categories

    • Article generation pipeline
      • New generator and tests under internal/article/
      • Category support with test coverage
    • Pricelist category integration
      • Handler and repository updates
      • Sync backfill test for category propagation

    Local Configuration Storage

    • Local DB support
      • New localdb models, converters, snapshots, and migrations
      • Local configuration service for cached configurations

    Export & UI

    • Export handler updates for article data output
    • Configs and index templates adjusted for new article-related fields

    Behavior Changes

    • Cross-user project updates allowed
      • Removed restriction in project service
    • Article compression refinement
      • Generator logic simplified to reduce complexity

    Breaking Changes

    None identified. Existing APIs remain intact.

    Files Modified

    1. internal/article/* - Article generator + categories + tests
    2. internal/localdb/* - Local DB models, migrations, snapshots
    3. internal/handlers/export.go - Export updates
    4. internal/handlers/pricelist.go - Category handling
    5. internal/services/sync/service.go - Category backfill logic
    6. web/templates/configs.html - Article field updates
    7. web/templates/index.html - Article field updates

    Stats: 33 files changed, 2059 insertions(+), 329 deletions(-)

    Commits

    • 5edffe8 - Add article generation and pricelist categories
    • e355903 - Allow cross-user project updates
    • e58fd35 - Refine article compression and simplify generator

    Testing Checklist

    • Tests not run (not requested)

    Migration Notes

    • New migrations:
      • 022_add_article_to_configurations.sql
      • 023_add_server_model_to_configurations.sql
      • 024_add_support_code_to_configurations.sql
      • Ensure migrations are applied before running v1.3.0
    Downloads
  • v1.2.3 99fd80bca7

    mchus released this 2026-02-10 11:11:10 +03:00 | 216 commits to main since this release

    Summary

    Unified synchronization functionality with event-driven UI updates. Resolved user confusion about duplicate sync buttons by implementing a single sync source with automatic page refreshes.

    Changes

    Main Feature: Sync Event System

    • Added sync-completed event in base.html's syncAction() function
      • Dispatched after successful /api/sync/all or /api/sync/push
      • Includes endpoint and response data in event detail
      • Enables pages to react automatically to sync completion

    Configs Page (configs.html)

    • Removed "Импорт с сервера" button - duplicate functionality no longer needed
    • Updated layout - changed from 2-column grid to single button layout
    • Removed importConfigsFromServer() function - functionality now handled by navbar sync
    • Added sync-completed event listener:
      • Automatically reloads configurations list after sync
      • Resets pagination to first page
      • New configurations appear immediately without manual refresh

    Projects Page (projects.html)

    • Wrapped initialization in DOMContentLoaded:
      • Moved loadProjects() and all event listeners inside handler
      • Ensures DOM is fully loaded before accessing elements
    • Added sync-completed event listener:
      • Automatically reloads projects list after sync
      • New projects appear immediately without manual refresh

    Pricelists Page (pricelists.html)

    • Added sync-completed event listener to existing DOMContentLoaded:
      • Automatically reloads pricelists when sync completes
      • Maintains existing permissions and modal functionality

    Benefits

    User Experience

    • Single "Синхронизация" button in navbar - no confusion about sync sources
    • Automatic list updates after sync - no need for manual F5 refresh
    • Consistent behavior across all pages (configs, projects, pricelists)
    • Better feedback: toast notification + automatic UI refresh

    Architecture

    • Event-driven loose coupling between navbar and pages
    • Easy to extend to other pages (just add event listener)
    • No backend changes needed
    • Production-ready

    Breaking Changes

    • /api/configs/import endpoint still works but UI button removed
      • Users should use navbar "Синхронизация" button instead
      • Backend API remains unchanged for backward compatibility

    Files Modified

    1. web/templates/base.html - Added sync-completed event dispatch
    2. web/templates/configs.html - Event listener + removed duplicate UI
    3. web/templates/projects.html - DOMContentLoaded wrapper + event listener
    4. web/templates/pricelists.html - Event listener for auto-refresh

    Stats: 4 files changed, 59 insertions(+), 65 deletions(-)

    Commits

    • 99fd80b - feat: unify sync functionality with event-driven UI updates

    Testing Checklist

    • Configs page: New configurations appear after navbar sync
    • Projects page: New projects appear after navbar sync
    • Pricelists page: Pricelists refresh after navbar sync
    • Both /api/sync/all and /api/sync/push trigger updates
    • Toast notifications still show correctly
    • Sync status indicator updates
    • Error handling (423, network errors) still works
    • Mode switching (Active/Archive) works correctly
    • Backward compatibility maintained

    Known Issues

    None - implementation is production-ready

    Migration Notes

    No migration needed. Changes are frontend-only and backward compatible:

    • Old /api/configs/import endpoint still functional
    • No database schema changes
    • No configuration changes needed
    Downloads
  • v1.2.2 8f596cec68

    mchus released this 2026-02-09 17:38:50 +03:00 | 219 commits to main since this release

    Summary

    Fixed CSV export filename inconsistency where project names weren't being resolved correctly. Standardized export format across both manual exports and project configuration exports to use YYYY-MM-DD (project_name) config_name BOM.csv.

    Commits

    • 8f596ce fix: standardize CSV export filename format to use project name

    Changes

    CSV Export Filename Standardization

    Problem:

    • ExportCSV and ExportConfigCSV had inconsistent filename formats
    • Project names sometimes fell back to config names when not explicitly provided
    • Export timestamps didn't reflect actual price update time

    Solution:

    • Unified format: YYYY-MM-DD (project_name) config_name BOM.csv
    • Both export paths now use PriceUpdatedAt if available, otherwise CreatedAt
    • Project name resolved from ProjectUUID via ProjectService for both paths
    • Frontend passes project_uuid context when exporting

    Technical Details:

    Backend:

    • Added ProjectUUID field to ExportRequest struct in handlers/export.go
    • Updated ExportCSV to look up project name from ProjectUUID using ProjectService
    • Ensured ExportConfigCSV gets project name from config's ProjectUUID
    • Both use CreatedAt (for ExportCSV) or PriceUpdatedAt/CreatedAt (for ExportConfigCSV)

    Frontend:

    • Added projectUUID and projectName state variables in index.html
    • Load and store projectUUID when configuration is loaded
    • Pass project_uuid in JSON body for both export requests

    Files Modified

    • internal/handlers/export.go - Project name resolution and ExportRequest update
    • internal/handlers/export_test.go - Updated mock initialization with projectService param
    • cmd/qfs/main.go - Pass projectService to ExportHandler constructor
    • web/templates/index.html - Add projectUUID tracking and export payload updates

    Testing Notes

    All existing tests updated and passing
    Code builds without errors
    Export filename now includes correct project name
    Works for both form-based and project-based exports

    Breaking Changes

    None - API response format unchanged, only filename generation updated.

    Known Issues

    None identified.

    Downloads
  • v1.2.1 8fd27d11a7

    QuoteForge v1.2.1 Pre-Release

    mchus released this 2026-02-09 15:45:00 +03:00 | 220 commits to main since this release

    Дата релиза: 2026-02-09
    Тег: v1.2.1
    GitHub: https://git.mchus.pro/mchus/QuoteForge/releases/tag/v1.2.1

    Резюме

    Быстрый патч-релиз, исправляющий регрессию в конфигураторе после рефактора v1.2.0. После удаления поля CurrentPrice из компонентов, autocomplete перестал показывать компоненты. Теперь используется на-demand загрузка цен через API.

    Что исправлено

    🐛 Configurator Component Substitution (acf7c8a)

    • Проблема: После рефактора в v1.2.0, autocomplete фильтровал ВСЕ компоненты, потому что проверял удаленное поле current_price
    • Решение: Загрузка цен на-demand через /api/quote/price-levels
      • Добавлен componentPricesCache для кэширования цен в памяти
      • Функция ensurePricesLoaded() загружает цены при фокусе на поле поиска
      • Все 3 режима autocomplete (single, multi, section) обновлены
      • Компоненты без цен по-прежнему фильтруются (как требуется), но проверка использует API
    • Затронутые файлы: web/templates/index.html (+66 строк, -12 строк)

    История v1.2.0 → v1.2.1

    Всего коммитов: 2

    Хеш Автор Сообщение
    acf7c8a Claude fix: load component prices via API instead of removed current_price field
    5984a57 Claude refactor: remove CurrentPrice from local_components and transition to pricelist-based pricing

    Тестирование

    Configurator component substitution работает
    Цены загружаются корректно из pricelist
    Offline режим поддерживается (цены кэшируются после первой загрузки)
    Multi-pricelist поддержка функциональна (estimate/warehouse/competitor)

    Breaking Changes

    Нет критических изменений для конечных пользователей.

    ⚠️ Для разработчиков: ComponentView API больше не возвращает CurrentPrice.

    Миграция

    Не требуется миграция БД — все миграции были применены в v1.2.0.

    Установка

    macOS

    # Скачать и распаковать
    tar xzf qfs-v1.2.1-darwin-arm64.tar.gz  # для Apple Silicon
    # или
    tar xzf qfs-v1.2.1-darwin-amd64.tar.gz  # для Intel Mac
    
    # Снять ограничение Gatekeeper (если требуется)
    xattr -d com.apple.quarantine ./qfs
    
    # Запустить
    ./qfs
    

    Linux

    tar xzf qfs-v1.2.1-linux-amd64.tar.gz
    ./qfs
    

    Windows

    # Распаковать qfs-v1.2.1-windows-amd64.zip
    # Запустить qfs.exe
    

    Известные проблемы

    Нет известных проблем на момент релиза.

    Поддержка

    По вопросам обращайтесь: @mchus

    Downloads
  • v1.2.0 84dda8cf0a

    mchus released this 2026-02-09 11:44:23 +03:00 | 224 commits to main since this release

    v1.2.0 — Export Improvements & Sync Stability Released: 2026-02-09

    🎯 Key Changes

    Features

    CSV Export Enhancements

    • Streaming CSV with Excel compatibility — Export large datasets efficiently with proper Excel BOM encoding
    • Smart filename handling — Project name automatically included in exported CSV filename format: YYYY-MM-DD (PROJECT-NAME).csv
    • Content-Disposition header support — Browser respects suggested filename from server for better UX

    Projects API

    • New /api/projects/all endpoint — Get unlimited project list without pagination (complements existing paginated endpoint)

    🐛 Bug Fixes

    Database Synchronization

    • Fixed sync blockage with limited database users — Application now checks if migration registry tables exist before attempting to create them, eliminating permission errors for read-limited DB users
    • Graceful permission handling — No longer requires CREATE TABLE privileges if tables already exist
    • Applies same robustness to user sync status table creation and management

    📚 Documentation

    • Complete database user permissions guide — Added comprehensive table-by-table permissions documentation
    • Clarifies which tables require SELECT only vs SELECT, INSERT, UPDATE
    • Explains that sync infrastructure tables must be created by DB admin (not by app)

    📋 Detailed Changes

    Type Description
    Feature Export: implement streaming CSV with Excel compatibility
    Feature Export: update CSV filename format to YYYY-MM-DD (PROJECT-NAME) BOM
    Feature Export: use filename from Content-Disposition header in browser
    Feature Export: add project name to CSV filename format
    Feature Projects: add /all endpoint for unlimited project list
    Fix Sync: handle database permission issues in sync migration verification
    Docs Document complete database user permissions for sync support

    🔧 Database Permissions

    To enable sync for users with limited DB privileges, ensure these tables exist (created by administrator):

    • qt_client_local_migrations — SELECT only
    • qt_client_schema_state — SELECT, INSERT, UPDATE
    • qt_pricelist_sync_status — SELECT, INSERT, UPDATE

    See README.md for complete permission setup.

    🚀 Installation & Upgrade

    # No database migrations required for this release
    # Simply deploy the new binary
    
    go run ./cmd/qfs
    
    📊 Statistics
    
    - 7 commits merged
    - 5 export & API features added
    - 1 critical sync stability fix
    - Full backward compatibility maintained
    
    🙏 Notes
    
    - This release improves offline-first reliability by reducing external dependencies
    - CSV exports now use standard Excel-compatible BOM encoding
    - Better UX for project-specific configuration exports
    - Users with read-limited database accounts can now sync successfully
    
    ---
    Installation: See README.md for setup instructions.
    
    Downloads
  • v1.1.0 17969277e6

    mchus released this 2026-02-08 10:29:51 +03:00 | 231 commits to main since this release

    QuoteForge v1.1.0

    Дата релиза: 2026-02-08
    Тег: v1.1.0

    Что нового

    • Завершен переход на local-first: локальная SQLite, стабильный офлайн-старт и фоновая синхронизация.
    • Синхронизация стала надежнее: корректный full sync push/pull, обработка stale/orphan событий, восстановление missing-конфигураций.
      - Добавлен полноценный модуль проектов: отдельные проекты, tracker_url, создание и управление через UI.
    • Улучшены прайслисты и ценообразование: стабильнее пересчет, проверки прав, меньше ошибок в online/offline сценариях.
    • Реализован и доработан поток импорта остатков: привязка partnumber к лотам, улучшенный UX и фиксы UI-багов.
      - Позиции прайслиста теперь обогащаются актуальными остатками и partnumber из stock_log.
    • Усилен CORS: доступ только с loopback-origin (localhost, 127.0.0.1, ::1).
    • Обновлен релизный контур: бинарник qfs, флаг -version, сборка и упаковка под Linux/macOS/Windows.

    Запуск на macOS

    Снимите карантинный атрибут через терминал: xattr -d com.apple.quarantine /path/to/qfs-darwin-arm64
    После этого бинарник запустится без предупреждения Gatekeeper.

    Downloads
  • v1.0.4 7523a7d887

    Release v1.0.4 Pre-Release

    mchus released this 2026-02-07 21:25:01 +03:00 | 236 commits to main since this release

    QuoteForge v1.0.4

    Дата релиза: 2026-02-07
    Тег: v1.0.4
    Диапазон изменений: v1.0.3..v1.0.4

    Что нового

    • Удалён модуль admin pricing (UI, API и связанные сервисы).
    • Удалены подсистемы alerts, stock import, warehouse-алгоритмы, а также cmd/cron и cmd/importer.
    • PricelistHandler переведён в read-only режим:
      • GET /api/pricelists
      • GET /api/pricelists/latest
      • GET /api/pricelists/:id
      • GET /api/pricelists/:id/items
      • GET /api/pricelists/:id/lots
    • Обновлена веб-навигация:
      • удалена ссылка «Администратор цен»;
      • добавлена отдельная страница «Прайслисты» (/pricelists).
    • Обновлена документация (CLAUDE.md) под новую область ответственности приложения.

    Совместимость

    • Offline-first и sync-поток сохранены полностью.
    • Read-only просмотр прайслистов работает через локальный SQLite-кэш.

    Запуск на macOS

    Снимите карантинный атрибут через терминал: xattr -d com.apple.quarantine /path/to/qfs-darwin-arm64
    После этого бинарник запустится без предупреждения Gatekeeper.

    Downloads
  • v1.0.3 c02a7eac73

    mchus released this 2026-02-06 14:04:11 +03:00 | 249 commits to main since this release

    QuoteForge v1.0.3

    Дата релиза: 2026-02-06
    Тег: v1.0.3
    Диапазон изменений: v1.0.2..v1.0.3

    Что нового

    • Добавлена страница управления проектами /projects с:
      • датой и временем создания проекта;
      • сортировкой по названию и дате создания;
      • серверной пагинацией;
      • фильтром по автору в заголовке таблицы.
    • Добавлена отдельная вкладка Статус синхронизации на уровне Алерты / Компоненты / Прайслисты.
    • Во вкладке статуса синхронизации отображаются:
      • пользователь;
      • версия приложения;
      • статус (онлайн или относительное время последней синхронизации).

    Изменения синхронизации

    • Реализован heartbeat синхронизации пользователей в MariaDB: qt_pricelist_sync_status.
    • Добавлен API GET /api/sync/users-status для UI статуса синхронизации.
    • Логика онлайн-статуса рассчитана от интервала фоновой синхронизации: 5 минут + 10%.
    • В heartbeat фиксируется версия приложения (app_version).

    Важные исправления

    • Исправлено восстановление отсутствующей серверной конфигурации при push обновлений.
    • Исправлено экранирование паролей в MySQL DSN в setup.
    • Улучшена логика запуска SQL-миграций на старте при отсутствии прав/необходимости.
    • Обновлена логика пересчета прайслистов через админский price-refresh.

    Миграции и совместимость

    Добавлены SQL-миграции:

    • migrations/010_add_pricelist_sync_status.sql
    • migrations/011_add_app_version_to_pricelist_sync_status.sql

    Релиз совместим с предыдущей веткой v1.0.x; новая таблица синхронизации создается автоматически.

    Коммиты в релизе

    • b1b50ce Add projects table controls and sync status tab with app version
    • 6ab1e98 sync: recover missing server config during update push
    • a1d2192 Fix MySQL DSN escaping for setup passwords and clarify DB user setup
    • a90c07c update stale files list
    • e9307c4 Apply remaining pricelist and local-first updates
    • 1b48401 Use admin price-refresh logic for pricelist recalculation
    • 4a86f7b fix: skip startup sql migrations when not needed or no permissions
    Downloads