Files
SERTY 310a64e3ba редактирование и удаление сопоставлений
список накладных с позициями
2025-12-29 10:46:05 +03:00

70 lines
2.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) GetByID(id uuid.UUID) (*suppliers.Supplier, error) {
var supplier suppliers.Supplier
err := r.db.Where("id = ? AND is_deleted = ?", id, false).First(&supplier).Error
if err != nil {
return nil, err
}
return &supplier, nil
}
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
}