Files
PriceForge/internal/services/seen_cleanup.go
Mikhail Chusavitin f73e3d144d Vendor mapping: wildcard ignore patterns, bulk CSV import, multi-lot qty
- 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>
2026-03-19 09:41:48 +03:00

21 lines
738 B
Go

package services
import (
"git.mchus.pro/mchus/priceforge/internal/models"
"gorm.io/gorm"
)
// purgeSeenLotNames removes polluted seen-registry rows where another system wrote a LOT name
// into qt_vendor_partnumber_seen.partnumber. Keep rows that already have an explicit PN mapping.
func purgeSeenLotNames(db *gorm.DB) error {
if db == nil {
return nil
}
return db.
Where("is_pattern = ?", false).
Where("EXISTS (SELECT 1 FROM lot l WHERE LOWER(TRIM(l.lot_name)) = LOWER(TRIM(qt_vendor_partnumber_seen.partnumber)))").
Where("NOT EXISTS (SELECT 1 FROM qt_partnumber_book_items pb WHERE LOWER(TRIM(pb.partnumber)) = LOWER(TRIM(qt_vendor_partnumber_seen.partnumber)))").
Delete(&models.VendorPartnumberSeen{}).
Error
}