mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
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
|
|
}
|