Mikhail Chusavitin
bca82f9dc0
export: implement streaming CSV with Excel compatibility
...
Implement Phase 1 CSV Export Optimization:
- Replace buffering with true HTTP streaming (ToCSV writes to io.Writer)
- Add UTF-8 BOM (0xEF 0xBB 0xBF) for correct Cyrillic display in Excel
- Use semicolon (;) delimiter for Russian Excel locale
- Use comma (,) as decimal separator in numbers (100,50 instead of 100.50)
- Add graceful two-phase error handling:
* Before streaming: return JSON errors for validation failures
* During streaming: log errors only (HTTP 200 already sent)
- Add backward-compatible ToCSVBytes() helper
- Add GET /api/configs/:uuid/export route for configuration export
New tests (13 total):
- Service layer (7 tests):
* UTF-8 BOM verification
* Semicolon delimiter parsing
* Total row formatting
* Category sorting
* Empty data handling
* Backward compatibility wrapper
* Writer error handling
- Handler layer (6 tests):
* Successful CSV export with streaming
* Invalid request validation
* Empty items validation
* Config export with proper headers
* 404 for missing configs
* Empty config validation
All tests passing, build verified.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2026-02-09 10:47:10 +03:00
593280de99
sync: clean stale local pricelists and migrate runtime config handling
2026-02-08 10:01:27 +03:00
7523a7d887
Remove admin pricing stack and prepare v1.0.4 release
2026-02-07 21:23:23 +03:00
b629af9742
Implement warehouse/lot pricing updates and configurator performance fixes
2026-02-07 05:20:35 +03:00
Mikhail Chusavitin
5f2969a85a
Refine stock import UX with suggestions, ignore rules, and inline mapping controls
2026-02-06 19:58:42 +03:00
Mikhail Chusavitin
104a26d907
Add stock pricelist admin flow with mapping placeholders and warehouse details
2026-02-06 19:37:12 +03:00
Mikhail Chusavitin
b965c6bb95
WIP: save current pricing and pricelist changes
2026-02-06 19:07:22 +03:00
Mikhail Chusavitin
2f0ac2f6d2
projects: add tracker_url and project create modal
2026-02-06 16:42:32 +03:00
Mikhail Chusavitin
3d5ab63970
Make full sync push pending and pull projects/configurations
2026-02-06 15:25:07 +03:00
Mikhail Chusavitin
651427e0dd
Add projects table controls and sync status tab with app version
2026-02-06 14:02:21 +03:00
Mikhail Chusavitin
80ec7bc6b8
Apply remaining pricelist and local-first updates
2026-02-06 13:01:40 +03:00
Mikhail Chusavitin
1744e6a3b8
fix: skip startup sql migrations when not needed or no permissions
2026-02-06 11:56:55 +03:00
Mikhail Chusavitin
726dccb07c
feat: add projects flow and consolidate default project handling
2026-02-06 11:39:12 +03:00
Mikhail Chusavitin
c0beed021c
Enforce pricelist write checks and auto-restart on DB settings change
2026-02-05 15:44:54 +03:00
Mikhail Chusavitin
548a256d04
Drop qt_users dependency for configs and track app version
2026-02-05 15:07:23 +03:00
Mikhail Chusavitin
41c0a47f54
Implement local DB migrations and archived configuration lifecycle
2026-02-04 18:52:56 +03:00
Mikhail Chusavitin
f4f92dea66
Store configuration owner by MariaDB username
2026-02-04 12:20:41 +03:00
Mikhail Chusavitin
d094d39427
Add server-to-local configuration import in web UI
2026-02-04 11:31:23 +03:00
Mikhail Chusavitin
4509e93864
Store config in user state and clean old release notes
2026-02-04 11:21:48 +03:00
Mikhail Chusavitin
e2800b06f9
Log binary version and executable path on startup
2026-02-04 10:21:18 +03:00
Mikhail Chusavitin
7c606af2bb
Fix missing config handling and auto-restart after setup
2026-02-04 10:19:35 +03:00
Mikhail Chusavitin
fabd30650d
Store local DB in user state dir as qfs.db
2026-02-04 10:03:17 +03:00
a3dc264efd
Merge feature/phase2-sqlite-sync into main
2026-02-03 22:04:17 +03:00
Mikhail Chusavitin
0eb6730a55
fix: Windows compatibility and localhost binding
...
**Windows compatibility:**
- Added filepath.Join for all template and static paths
- Fixes "path not found" errors on Windows
**Localhost binding:**
- Changed default host from 0.0.0.0 to 127.0.0.1
- Browser always opens on 127.0.0.1 (localhost)
- Setup mode now listens on 127.0.0.1:8080
- Updated config.example.yaml with comment about 0.0.0.0
This ensures the app works correctly on Windows and opens
browser on the correct localhost address.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-03 11:38:28 +03:00
Mikhail Chusavitin
0bdd163728
feat: add version flag and Makefile for release builds
...
- Add -version flag to show build version
- Add Makefile with build targets:
- make build-release: optimized build with version
- make build-all: cross-compile for Linux/macOS
- make run/test/clean: dev commands
- Update documentation with build commands
- Version is embedded via ldflags during build
Usage:
make build-release # Build with version
./bin/qfs -version # Show version
Version format: v0.2.5-1-gfa0f5e3 (tag-commits-hash)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-03 10:57:22 +03:00
Mikhail Chusavitin
fa0f5e321d
refactor: rename binary from quoteforge to qfs
...
- Rename cmd/server to cmd/qfs for shorter binary name
- Update all documentation references (README, CLAUDE.md, etc.)
- Update build commands to output bin/qfs
- Binary name now matches directory name
Usage:
go run ./cmd/qfs # Development
go build -o bin/qfs ./cmd/qfs # Production
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-03 10:55:14 +03:00