package suppliers import ( "rmser/internal/domain/suppliers" "time" "github.com/google/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) type pgRepository struct { db *gorm.DB } func NewRepository(db *gorm.DB) suppliers.Repository { return &pgRepository{db: db} } func (r *pgRepository) SaveBatch(list []suppliers.Supplier) error { if len(list) == 0 { return nil } return r.db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).CreateInBatches(list, 100).Error } // GetRankedByUsage возвращает поставщиков для конкретного сервера, // отсортированных по количеству накладных за последние N дней. func (r *pgRepository) GetRankedByUsage(serverID uuid.UUID, daysLookBack int) ([]suppliers.Supplier, error) { var result []suppliers.Supplier dateThreshold := time.Now().AddDate(0, 0, -daysLookBack) // SQL: Join Suppliers с Invoices, Group By Supplier, Order By Count DESC // Учитываем только активных поставщиков и накладные этого же сервера (через supplier_id + default_store_id косвенно, // но лучше явно фильтровать suppliers по rms_server_id). // *Примечание:* Invoices пока не имеют поля rms_server_id явно в старой схеме, // но мы должны фильтровать Suppliers по serverID. err := r.db.Table("suppliers"). Select("suppliers.*, COUNT(invoices.id) as usage_count"). Joins("LEFT JOIN invoices ON invoices.supplier_id = suppliers.id AND invoices.date_incoming >= ?", dateThreshold). Where("suppliers.rms_server_id = ? AND suppliers.is_deleted = ?", serverID, false). Group("suppliers.id"). Order("usage_count DESC, suppliers.name ASC"). Find(&result).Error return result, err } func (r *pgRepository) Count(serverID uuid.UUID) (int64, error) { var count int64 err := r.db.Model(&suppliers.Supplier{}). Where("rms_server_id = ? AND is_deleted = ?", serverID, false). Count(&count).Error return count, err }