• v1.5.4 579ff46a7f

    mchus released this 2026-03-16 08:33:53 +03:00 | 12 commits to main since this release

    Дата релиза: 2026-03-16
    Тег: v1.5.4

    Предыдущий релиз: v1.5.0

    Ключевые изменения

    • pricing tab переработан: закупка и продажа разделены на отдельные таблицы с ценами за 1 шт.;
    • экран прайслиста переработан под разные типы источников; удалены misleading-колонки Поставщик и partnumbers;
    • runtime и startup ужесточены: локальный клиент принудительно работает только на loopback, конфиг автоматически нормализуется;
    • добавлены действия с вариантом и унифицированы правила именования _копия для вариантов и конфигураций;
    • исправлен CSV-экспорт прайсинговых таблиц в конфигураторе под Excel-совместимый формат Excel-friendly;
    • таблица проектов переработана: дата последней правки, tooltip с деталями, отдельный автор, компактные действия и ссылка на трекер;
    • sync больше не подменяет updated_at проектов временем синхронизации;
    • добавлена одноразовая утилита cmd/migrate_project_updated_at для пересинхронизации updated_at проектов из MariaDB в локальную SQLite;
    • runtime config, release notes и bible-local/ очищены и приведены к актуальной архитектуре;
    • scripts/release.sh больше не затирает существующий RELEASE_NOTES.md.

    Summary

    UI и UX

    • вкладка ценообразования теперь разделена на отдельные таблицы закупки и продажи;
    • список проектов переработан: новая колонка даты, отдельный автор, tooltip с деталями, компактные действия, ссылка на трекер;
    • для вариантов добавлены действия переименования, переноса и копирования;
    • копии вариантов и конфигураций теперь именуются единообразно: _копия, _копия2, _копия3.

    Прайслисты и экспорт

    • экран прайслиста переработан под разные типы источников;
    • из прайслистов убраны misleading-колонки Поставщик и partnumbers;
    • CSV-экспорт прайсинговых таблиц в конфигураторе приведён к Excel-совместимому формату.

    Runtime и sync

    • локальный runtime нормализует server.host к 127.0.0.1 и переписывает некорректный runtime config;
    • sync перестал подменять updated_at проектов временем локальной синхронизации;
    • добавлена утилита cmd/migrate_project_updated_at для восстановления локальных дат проектов с сервера.

    Документация и release tooling

    • bible-local/ сокращён до актуальных архитектурных контрактов;
    • release notes и release-структура приведены к одному формату;
    • scripts/release.sh теперь сохраняет существующий RELEASE_NOTES.md и не затирает его шаблоном.

    Затронутые области

    • cmd/qfs/;
    • cmd/migrate_project_updated_at/;
    • internal/localdb/;
    • internal/services/project.go;
    • internal/services/sync/service.go;
    • internal/handlers/pricelist.go;
    • web/templates/pricelist_detail.html;
    • web/templates/index.html;
    • web/templates/project_detail.html;
    • web/templates/projects.html;
    • web/templates/configs.html;
    • bible-local/.

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

    • схема данных не меняется;
    • серверные SQL-миграции не требуются;
    • для уже испорченных локальных дат проектов можно один раз запустить go run ./cmd/migrate_project_updated_at -apply.
    Downloads
  • v1.5.0 06397a6bd1

    v1.5.0 Pre-Release

    mchus released this 2026-03-07 23:18:07 +03:00 | 22 commits to main since this release

    Что нового?

    • Добавлен импорт vendor workspace и связанный workflow обработки vendor spec.
      • Добавлен экспорт pricing/конфигураций в новом сервисном контуре.
      • Починена работа price levels в offline/local-first режиме.
      • Приложение переведено на более жёсткий local-first runtime: обычная работа больше не зависит от прямых запросов в MariaDB вне sync.
      • Удалены auth/RBAC и связанный мёртвый код для старой server-style модели.
      • Усилен startup recovery локальной SQLite: битые read-only кэши теперь могут автоматически quarantine/reset, чтобы приложение запускалось.
      • Переработан локальный каталог partnumber books и логика enrichment прайслистов через локальную копию qt_partnumber_book_items.
      • Полностью выпилен legacy-механизм lot_partnumbers.
      • Убрана неиспользуемая server-driven схема client local migrations.
      • Исправлен генератор article для кейса с 1xINTEL в GPU-сегменте.

    Как работает импорт xml

    В проекте добавлена новая кнопка "Импорт выгрузки вендора"
    image.png
    В данной версии поддерживаются только xml файлы конфигуратора lenovo - dcsc.
    Загружаются файлы-по одному.
    image.png
    После импорта распознанные аппаратные позиции добавляются в проект с соблюдением колличества и названия из конфигуратора
    image.png

    Распознавание спеки вендора

    Этот функционал релизнут в версии v1.4 но допилен тут. В разделе конфигуратора добавились вкладки
    image.png
    На вкладке BOM вставляется спека вендора из буфера обмена, либо если использовали импорт xml - она уже добавлена автоматически.
    image.png
    p/n для которых есть сопоставления в базе размечаются автоматически.

    Если работу начали со вставки BOM то внизу таблицы есть кнопка "пересчитать эстимейт" которая заменяет содержимое калькулятора распознанными LOT:

    Downloads
  • v1.4 ed0ef04d10

    mchus released this 2026-03-04 12:35:40 +03:00 | 30 commits to main since this release

    Импорт вендорной спецификации (BOM)

    • Полный цикл импорта BOM из вставки вендорного текста: разбор, привязка PN→LOT, автодополнение LOT.
    • Страница Партномера — сводная таблица всех встреченных партномеров с привязками к LOT.
    • Канонический механизм lot_mappings: изменения всегда сохраняются через единую точку записи.
    • При импорте конфигурации проекта локальная вендорная спецификация больше не затирается.

    Ценообразование

    • Переименование: «цена поставщика» → «цена проекта» во всём интерфейсе и экспорте.
    • Расширен CSV-экспорт прайсинга: добавлены дополнительные поля стоимости.
    • Исправлены итоговые суммы по складу на вкладке прайсинга.

    Таблица проектов

    • Компактный макет: столбцы дат и названий сжаты для отображения большего числа строк.
    • Исправлена нумерация строк при создании нового проекта.

    BOM — UX

    • Упрощена вставка BOM: фиксированный позиционный порядок столбцов.
    • Добавлена кнопка «Очистить BOM» со сбросом на стороне сервера.
    • Подсказка по формату рядом с полем вставки вендорного BOM.

    Исправления

    • Прайслисты: корректная работа при ограниченных правах БД; активы из встроенных ресурсов.
    • Синхронизация: дополнение недостающих позиций для уже существующих локальных прайслистов.
    • Миграции БД: новые SQLite-таблицы создаются через AutoMigrate вместо хардкодных миграций.
    • BOM: сохранение локальной вендорной спецификации при импорте конфига.

    Запуск на macOS

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

    Downloads
  • v1.3.5 7b371add10

    v1.3.5 Pre-Release

    mchus released this 2026-02-24 15:13:41 +03:00 | 53 commits to main since this release

    Синхронизация прайслистов теперь догружает позиции для уже существующих локально прайслистов, если локальный кэш позиций пуст.
    Исправлен кейс 0 позиций в прайслисте при частично заполненном локальном кэше (local_pricelists есть, local_pricelist_items пусты).
    Добавлен graceful fallback при ограниченных правах MariaDB:
    если нет SELECT на lot_partnumbers и/или stock_log, синк прайслиста больше не падает;
    позиции и цены сохраняются без enrichment (могут отсутствовать остатки и partnumbers).
    Убран fallback на файловые templates/static рядом с бинарником:
    приложение всегда использует embedded-ресурсы из бинарника.
    Актуализирована документация по правам MariaDB (03-database.md):
    добавлены обязательные SELECT на lot_partnumbers и stock_log для полноценной синхронизации прайслистов.

    Downloads
  • v1.3.4 8d7fab39b4

    mchus released this 2026-02-24 15:09:12 +03:00 | 55 commits to main since this release

    Исправлен кейс, когда в списке прайслистов отображалось 0 позиций при наличии локальных “шапок” прайслистов.
    Теперь при синхронизации приложение догружает позиции для уже существующих локально прайслистов, если local_pricelist_items пусты.
    Добавлен graceful fallback при ограниченных правах MariaDB.
    Если у пользователя нет SELECT на RFQ_LOG.lot_partnumbers и/или RFQ_LOG.stock_log, синхронизация позиций прайслиста больше не падает.
    Позиции и цены прайслиста сохраняются без enrichment (могут отсутствовать partnumbers и остатки available_qty).
    Убран fallback на файловые web/templates и web/static рядом с бинарником.
    Приложение теперь всегда использует embedded-ресурсы из бинарника.
    Это делает поставку более предсказуемой на клиентских машинах.
    Обновлена документация по правам MariaDB (03-database.md).
    Добавлены обязательные SELECT-права на lot_partnumbers и stock_log для полноценной синхронизации прайслистов.
    Рекомендации после обновления

    Обновить клиент до v1.3.4.
    Нажать Синхронизация.

    Downloads
  • v1.3.2 cc9b846c31

    Release v1.3.2 Pre-Release

    mchus released this 2026-02-19 18:48:01 +03:00 | 61 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 | 69 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 | 75 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 | 78 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 | 81 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