diff --git a/internal/repository/pricelist.go b/internal/repository/pricelist.go index 82cecf3..806e764 100644 --- a/internal/repository/pricelist.go +++ b/internal/repository/pricelist.go @@ -29,6 +29,34 @@ func (r *PricelistRepository) List(offset, limit int) ([]models.PricelistSummary return nil, 0, fmt.Errorf("listing pricelists: %w", err) } + return r.toSummaries(pricelists), total, nil +} + +// ListActive returns active pricelists with pagination. +func (r *PricelistRepository) ListActive(offset, limit int) ([]models.PricelistSummary, int64, error) { + var total int64 + if err := r.db.Model(&models.Pricelist{}).Where("is_active = ?", true).Count(&total).Error; err != nil { + return nil, 0, fmt.Errorf("counting active pricelists: %w", err) + } + + var pricelists []models.Pricelist + if err := r.db.Where("is_active = ?", true).Order("created_at DESC").Offset(offset).Limit(limit).Find(&pricelists).Error; err != nil { + return nil, 0, fmt.Errorf("listing active pricelists: %w", err) + } + + return r.toSummaries(pricelists), total, nil +} + +// CountActive returns the number of active pricelists. +func (r *PricelistRepository) CountActive() (int64, error) { + var total int64 + if err := r.db.Model(&models.Pricelist{}).Where("is_active = ?", true).Count(&total).Error; err != nil { + return 0, fmt.Errorf("counting active pricelists: %w", err) + } + return total, nil +} + +func (r *PricelistRepository) toSummaries(pricelists []models.Pricelist) []models.PricelistSummary { // Get item counts for each pricelist summaries := make([]models.PricelistSummary, len(pricelists)) for i, pl := range pricelists { @@ -48,7 +76,7 @@ func (r *PricelistRepository) List(offset, limit int) ([]models.PricelistSummary } } - return summaries, total, nil + return summaries } // GetByID returns a pricelist by ID diff --git a/internal/services/quote.go b/internal/services/quote.go index 9b3f17c..05a3427 100644 --- a/internal/services/quote.go +++ b/internal/services/quote.go @@ -132,6 +132,11 @@ func (s *QuoteService) ValidateAndCalculate(req *QuoteRequest) (*QuoteValidation // RecordUsage records that components were used in a quote func (s *QuoteService) RecordUsage(items []models.ConfigItem) error { + if s.statsRepo == nil { + // Offline mode: usage stats are unavailable and should not block config saves. + return nil + } + for _, item := range items { revenue := item.UnitPrice * float64(item.Quantity) if err := s.statsRepo.IncrementUsage(item.LotName, item.Quantity, revenue); err != nil { diff --git a/internal/services/sync/service.go b/internal/services/sync/service.go index a08e14a..e995da4 100644 --- a/internal/services/sync/service.go +++ b/internal/services/sync/service.go @@ -44,9 +44,9 @@ func (s *Service) GetStatus() (*SyncStatus, error) { if connStatus.IsConnected { if mariaDB, err := s.connMgr.GetDB(); err == nil && mariaDB != nil { pricelistRepo := repository.NewPricelistRepository(mariaDB) - serverPricelists, _, err := pricelistRepo.List(0, 1) + activeCount, err := pricelistRepo.CountActive() if err == nil { - serverCount = len(serverPricelists) + serverCount = int(activeCount) } } } @@ -126,10 +126,10 @@ func (s *Service) SyncPricelists() (int, error) { // Create repository pricelistRepo := repository.NewPricelistRepository(mariaDB) - // Get all active pricelists from server (up to 100) - serverPricelists, _, err := pricelistRepo.List(0, 100) + // Get active pricelists from server (up to 100) + serverPricelists, _, err := pricelistRepo.ListActive(0, 100) if err != nil { - return 0, fmt.Errorf("getting server pricelists: %w", err) + return 0, fmt.Errorf("getting active server pricelists: %w", err) } synced := 0