Merge origin/main

This commit is contained in:
Mikhail Chusavitin
2026-02-18 10:12:07 +03:00
18 changed files with 1236 additions and 159 deletions

View File

@@ -177,39 +177,43 @@ func (s *Service) CreateForSourceWithProgress(createdBy, source string, sourceIt
}
if len(sourceItems) > 0 {
// Load categories for all lot names if not provided
lotNamesToLoad := make([]string, 0)
// For warehouse and other explicit source items - use only provided data
// DO NOT load metadata settings (price_period_days, coefficient, etc.)
// Load categories from lot table
lotNames := make([]string, 0, len(sourceItems))
for _, srcItem := range sourceItems {
if strings.TrimSpace(srcItem.LotName) != "" && srcItem.Price > 0 && srcItem.Category == "" {
lotNamesToLoad = append(lotNamesToLoad, strings.TrimSpace(srcItem.LotName))
if strings.TrimSpace(srcItem.LotName) != "" {
lotNames = append(lotNames, strings.TrimSpace(srcItem.LotName))
}
}
categoryByLot := make(map[string]string)
if len(lotNamesToLoad) > 0 {
var lotCategories []struct {
LotName string
LotCategory string
}
if err := s.db.Table("lot").Select("lot_name, lot_category").Where("lot_name IN ?", lotNamesToLoad).Scan(&lotCategories).Error; err == nil {
for _, lc := range lotCategories {
categoryByLot[lc.LotName] = lc.LotCategory
categoryMap := make(map[string]*string)
if len(lotNames) > 0 {
var lots []models.Lot
if err := s.db.Where("lot_name IN ?", lotNames).Find(&lots).Error; err == nil {
for _, lot := range lots {
categoryMap[lot.LotName] = lot.LotCategory
}
}
}
items = make([]models.PricelistItem, 0, len(sourceItems))
for _, srcItem := range sourceItems {
if strings.TrimSpace(srcItem.LotName) == "" || srcItem.Price <= 0 {
lotName := strings.TrimSpace(srcItem.LotName)
if lotName == "" || srcItem.Price <= 0 {
continue
}
category := srcItem.Category
category := strings.TrimSpace(srcItem.Category)
if category == "" {
category = categoryByLot[strings.TrimSpace(srcItem.LotName)]
if catPtr, ok := categoryMap[lotName]; ok && catPtr != nil {
category = *catPtr
}
}
items = append(items, models.PricelistItem{
PricelistID: pricelist.ID,
LotName: strings.TrimSpace(srcItem.LotName),
LotName: lotName,
LotCategory: categoryMap[lotName],
Price: srcItem.Price,
PriceMethod: strings.TrimSpace(srcItem.PriceMethod),
Category: category,
@@ -230,6 +234,22 @@ func (s *Service) CreateForSourceWithProgress(createdBy, source string, sourceIt
return nil, fmt.Errorf("getting lot metadata with categories: %w", err)
}
// Load categories from lot table for all metadata items
lotNames := make([]string, 0, len(metadata))
for _, m := range metadata {
lotNames = append(lotNames, m.LotName)
}
categoryMap := make(map[string]*string)
if len(lotNames) > 0 {
var lots []models.Lot
if err := s.db.Where("lot_name IN ?", lotNames).Find(&lots).Error; err == nil {
for _, lot := range lots {
categoryMap[lot.LotName] = lot.LotCategory
}
}
}
// Create pricelist items with all price settings
items = make([]models.PricelistItem, 0, len(metadata))
for _, m := range metadata {
@@ -239,6 +259,7 @@ func (s *Service) CreateForSourceWithProgress(createdBy, source string, sourceIt
items = append(items, models.PricelistItem{
PricelistID: pricelist.ID,
LotName: m.LotName,
LotCategory: categoryMap[m.LotName],
Price: *m.CurrentPrice,
PriceMethod: string(m.PriceMethod),
PricePeriodDays: m.PricePeriodDays,