Fix offline usage tracking and active pricelist sync
This commit is contained in:
@@ -29,6 +29,34 @@ func (r *PricelistRepository) List(offset, limit int) ([]models.PricelistSummary
|
|||||||
return nil, 0, fmt.Errorf("listing pricelists: %w", err)
|
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
|
// Get item counts for each pricelist
|
||||||
summaries := make([]models.PricelistSummary, len(pricelists))
|
summaries := make([]models.PricelistSummary, len(pricelists))
|
||||||
for i, pl := range 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
|
// GetByID returns a pricelist by ID
|
||||||
|
|||||||
@@ -132,6 +132,11 @@ func (s *QuoteService) ValidateAndCalculate(req *QuoteRequest) (*QuoteValidation
|
|||||||
|
|
||||||
// RecordUsage records that components were used in a quote
|
// RecordUsage records that components were used in a quote
|
||||||
func (s *QuoteService) RecordUsage(items []models.ConfigItem) error {
|
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 {
|
for _, item := range items {
|
||||||
revenue := item.UnitPrice * float64(item.Quantity)
|
revenue := item.UnitPrice * float64(item.Quantity)
|
||||||
if err := s.statsRepo.IncrementUsage(item.LotName, item.Quantity, revenue); err != nil {
|
if err := s.statsRepo.IncrementUsage(item.LotName, item.Quantity, revenue); err != nil {
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ func (s *Service) GetStatus() (*SyncStatus, error) {
|
|||||||
if connStatus.IsConnected {
|
if connStatus.IsConnected {
|
||||||
if mariaDB, err := s.connMgr.GetDB(); err == nil && mariaDB != nil {
|
if mariaDB, err := s.connMgr.GetDB(); err == nil && mariaDB != nil {
|
||||||
pricelistRepo := repository.NewPricelistRepository(mariaDB)
|
pricelistRepo := repository.NewPricelistRepository(mariaDB)
|
||||||
serverPricelists, _, err := pricelistRepo.List(0, 1)
|
activeCount, err := pricelistRepo.CountActive()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
serverCount = len(serverPricelists)
|
serverCount = int(activeCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,10 +126,10 @@ func (s *Service) SyncPricelists() (int, error) {
|
|||||||
// Create repository
|
// Create repository
|
||||||
pricelistRepo := repository.NewPricelistRepository(mariaDB)
|
pricelistRepo := repository.NewPricelistRepository(mariaDB)
|
||||||
|
|
||||||
// Get all active pricelists from server (up to 100)
|
// Get active pricelists from server (up to 100)
|
||||||
serverPricelists, _, err := pricelistRepo.List(0, 100)
|
serverPricelists, _, err := pricelistRepo.ListActive(0, 100)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("getting server pricelists: %w", err)
|
return 0, fmt.Errorf("getting active server pricelists: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
synced := 0
|
synced := 0
|
||||||
|
|||||||
Reference in New Issue
Block a user