package invoices import ( "time" "rmser/internal/domain/invoices" "github.com/google/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) type pgRepository struct { db *gorm.DB } func NewRepository(db *gorm.DB) invoices.Repository { return &pgRepository{db: db} } func (r *pgRepository) GetLastInvoiceDate(serverID uuid.UUID) (*time.Time, error) { var inv invoices.Invoice // Ищем последнюю накладную только для этого сервера err := r.db.Where("rms_server_id = ?", serverID).Order("date_incoming DESC").First(&inv).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } return nil, err } return &inv.DateIncoming, nil } func (r *pgRepository) SaveInvoices(list []invoices.Invoice) error { return r.db.Transaction(func(tx *gorm.DB) error { for _, inv := range list { if err := tx.Omit("Items").Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).Create(&inv).Error; err != nil { return err } // Удаляем старые Items для этой накладной if err := tx.Where("invoice_id = ?", inv.ID).Delete(&invoices.InvoiceItem{}).Error; err != nil { return err } if len(inv.Items) > 0 { if err := tx.Create(&inv.Items).Error; err != nil { return err } } } return nil }) } func (r *pgRepository) CountRecent(serverID uuid.UUID, days int) (int64, error) { var count int64 dateFrom := time.Now().AddDate(0, 0, -days) err := r.db.Model(&invoices.Invoice{}). Where("rms_server_id = ? AND date_incoming >= ?", serverID, dateFrom). Count(&count).Error return count, err }