редактирование и удаление сопоставлений

список накладных с позициями
This commit is contained in:
2025-12-29 10:46:05 +03:00
parent c2d382cb6a
commit 310a64e3ba
30 changed files with 1250 additions and 8173 deletions

View File

@@ -38,17 +38,32 @@ func (r *pgRepository) GetByID(id uuid.UUID) (*drafts.DraftInvoice, error) {
return &draft, nil
}
func (r *pgRepository) GetByRMSInvoiceID(rmsInvoiceID uuid.UUID) (*drafts.DraftInvoice, error) {
var draft drafts.DraftInvoice
err := r.db.
Where("rms_invoice_id = ?", rmsInvoiceID).
First(&draft).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
return nil, 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,
"rms_server_id": draft.RMSServerID,
"updated_at": gorm.Expr("NOW()"),
"status": draft.Status,
"document_number": draft.DocumentNumber,
"incoming_document_number": draft.IncomingDocumentNumber, // Добавлено поле для входящего номера документа
"date_incoming": draft.DateIncoming,
"supplier_id": draft.SupplierID,
"store_id": draft.StoreID,
"comment": draft.Comment,
"rms_invoice_id": draft.RMSInvoiceID,
"rms_server_id": draft.RMSServerID,
"updated_at": gorm.Expr("NOW()"),
}).Error
}
@@ -107,3 +122,23 @@ func (r *pgRepository) GetActive(serverID uuid.UUID) ([]drafts.DraftInvoice, err
return list, err
}
// GetRMSInvoiceIDToPhotoURLMap возвращает мапу rms_invoice_id -> sender_photo_url для сервера, где rms_invoice_id не NULL
func (r *pgRepository) GetRMSInvoiceIDToPhotoURLMap(serverID uuid.UUID) (map[uuid.UUID]string, error) {
var draftsList []drafts.DraftInvoice
err := r.db.
Select("rms_invoice_id", "sender_photo_url").
Where("rms_server_id = ? AND rms_invoice_id IS NOT NULL", serverID).
Find(&draftsList).Error
if err != nil {
return nil, err
}
result := make(map[uuid.UUID]string)
for _, d := range draftsList {
if d.RMSInvoiceID != nil {
result[*d.RMSInvoiceID] = d.SenderPhotoURL
}
}
return result, nil
}

View File

@@ -18,6 +18,19 @@ func NewRepository(db *gorm.DB) invoices.Repository {
return &pgRepository{db: db}
}
func (r *pgRepository) GetByID(id uuid.UUID) (*invoices.Invoice, error) {
var inv invoices.Invoice
err := r.db.
Preload("Items").
Preload("Items.Product").
Where("id = ?", id).
First(&inv).Error
if err != nil {
return nil, err
}
return &inv, nil
}
func (r *pgRepository) GetLastInvoiceDate(serverID uuid.UUID) (*time.Time, error) {
var inv invoices.Invoice
// Ищем последнюю накладную только для этого сервера
@@ -35,7 +48,8 @@ func (r *pgRepository) GetByPeriod(serverID uuid.UUID, from, to time.Time) ([]in
var list []invoices.Invoice
err := r.db.
Preload("Items").
Where("rms_server_id = ? AND date_incoming BETWEEN ? AND ?", serverID, from, to).
Preload("Items.Product").
Where("rms_server_id = ? AND date_incoming BETWEEN ? AND ? AND status != ?", serverID, from, to, "DELETED").
Order("date_incoming DESC").
Find(&list).Error
return list, err

View File

@@ -81,6 +81,7 @@ func (r *pgRepository) GetAllMatches(serverID uuid.UUID) ([]ocr.ProductMatch, er
err := r.db.
Preload("Product").
Preload("Product.MainUnit").
Preload("Product.Containers").
Preload("Container").
Where("rms_server_id = ?", serverID).
Order("updated_at DESC").

View File

@@ -51,6 +51,15 @@ func (r *pgRepository) GetRankedByUsage(serverID uuid.UUID, daysLookBack int) ([
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{}).

View File

@@ -572,12 +572,13 @@ func (c *Client) CreateIncomingInvoice(inv invoices.Invoice) (string, error) {
}
reqDTO := IncomingInvoiceImportXML{
DocumentNumber: inv.DocumentNumber,
DateIncoming: inv.DateIncoming.Format("02.01.2006"),
DefaultStore: inv.DefaultStoreID.String(),
Supplier: inv.SupplierID.String(),
Status: status,
Comment: comment,
DocumentNumber: inv.DocumentNumber,
IncomingDocumentNumber: inv.IncomingDocumentNumber, // Присваиваем входящий номер документа из домена
DateIncoming: inv.DateIncoming.Format("02.01.2006"),
DefaultStore: inv.DefaultStoreID.String(),
Supplier: inv.SupplierID.String(),
Status: status,
Comment: comment,
}
if inv.ID != uuid.Nil {

View File

@@ -195,10 +195,11 @@ type StoreReportItemXML struct {
// IncomingInvoiceImportXML описывает структуру для POST запроса импорта
type IncomingInvoiceImportXML struct {
XMLName xml.Name `xml:"document"`
ID string `xml:"id,omitempty"` // GUID, если редактируем
DocumentNumber string `xml:"documentNumber,omitempty"`
DateIncoming string `xml:"dateIncoming,omitempty"` // Format: dd.MM.yyyy
XMLName xml.Name `xml:"document"`
ID string `xml:"id,omitempty"` // GUID, если редактируем
DocumentNumber string `xml:"documentNumber,omitempty"`
IncomingDocumentNumber string `xml:"incomingDocumentNumber,omitempty"` // Входящий номер документа
DateIncoming string `xml:"dateIncoming,omitempty"` // Format: dd.MM.yyyy
Invoice string `xml:"invoice,omitempty"` // Номер счет-фактуры
DefaultStore string `xml:"defaultStore"` // GUID склада (обязательно)
Supplier string `xml:"supplier"` // GUID поставщика (обязательно)