package drafts import ( "rmser/internal/domain/drafts" "github.com/google/uuid" "github.com/shopspring/decimal" "gorm.io/gorm" ) type pgRepository struct { db *gorm.DB } func NewRepository(db *gorm.DB) drafts.Repository { return &pgRepository{db: db} } func (r *pgRepository) Create(draft *drafts.DraftInvoice) error { return r.db.Create(draft).Error } func (r *pgRepository) GetByID(id uuid.UUID) (*drafts.DraftInvoice, error) { var draft drafts.DraftInvoice err := r.db. Preload("Items", func(db *gorm.DB) *gorm.DB { return db.Order("draft_invoice_items.raw_name ASC") }). Preload("Items.Product"). Preload("Items.Product.MainUnit"). // Нужно для отображения единиц Preload("Items.Container"). Where("id = ?", id). First(&draft).Error if err != nil { return nil, err } return &draft, nil } func (r *pgRepository) Update(draft *drafts.DraftInvoice) error { // Обновляем только основные поля шапки return r.db.Model(draft).Updates(map[string]interface{}{ "status": draft.Status, "document_number": draft.DocumentNumber, "date_incoming": draft.DateIncoming, "supplier_id": draft.SupplierID, "store_id": draft.StoreID, "comment": draft.Comment, "rms_invoice_id": draft.RMSInvoiceID, "updated_at": gorm.Expr("NOW()"), }).Error } func (r *pgRepository) CreateItems(items []drafts.DraftInvoiceItem) error { if len(items) == 0 { return nil } return r.db.CreateInBatches(items, 100).Error } func (r *pgRepository) UpdateItem(itemID uuid.UUID, productID *uuid.UUID, containerID *uuid.UUID, qty, price decimal.Decimal) error { // Пересчитываем сумму sum := qty.Mul(price) // Определяем статус IsMatched: если productID задан - значит сматчено isMatched := productID != nil updates := map[string]interface{}{ "product_id": productID, "container_id": containerID, "quantity": qty, "price": price, "sum": sum, "is_matched": isMatched, } return r.db.Model(&drafts.DraftInvoiceItem{}). Where("id = ?", itemID). Updates(updates).Error } func (r *pgRepository) Delete(id uuid.UUID) error { return r.db.Delete(&drafts.DraftInvoice{}, id).Error }