- Add glob pattern support (* and ?) for ignore rules stored in
qt_vendor_partnumber_seen (is_pattern flag, migration 041)
- Pattern matching applied in stock/competitor import, partnumber book
snapshot, and vendor mappings list (Go-side via NormalizeKey)
- BulkUpsertMappings: replace N+1 loop with two batch SQL upserts,
validating all lots in a single query (~1500 queries → 3-4)
- CSV import: multi-lot per PN via repeated rows, optional qty column
- CSV export: updated column format vendor;partnumber;lot_name;qty;description;ignore;notes
- UI: ignore patterns section with add/delete, import progress feedback
- Update bible-local/vendor-mapping.md with new CSV format
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace Tailwind CDN (~350KB) with purged local CSS (~22KB)
- Replace htmx unpkg CDN with local static file
- Add Gzip middleware (standard library, sync.Pool) for all responses
- Add Cache-Control: public, max-age=3600 for /static/* assets
- Reduce status polling interval from 5s to 30s
- Add scripts/build-css.sh for CSS regeneration after template changes
- Document in bible-local/operations.md and history.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add GetLatestQuotesAllCompetitors() repo method: latest quote per
(competitor_id, partnumber) across all active competitors
- Add RebuildPricelist() service method: loads all quotes, applies each
competitor's discount, aggregates with weighted_median per lot,
creates single combined competitor pricelist
- Add POST /api/competitors/pricelist handler + route
- JS: "Создать прайслист" on competitor tab calls new endpoint instead
of the generic one that required explicit items
This allows recreating the competitor pricelist after new lot mappings
are added, without requiring a new file upload.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>