package drafts import ( "time" "rmser/internal/domain/catalog" "github.com/google/uuid" "github.com/shopspring/decimal" ) // Статусы черновика const ( StatusProcessing = "PROCESSING" // OCR в процессе StatusReadyToVerify = "READY_TO_VERIFY" // Распознано, ждет проверки пользователем StatusCompleted = "COMPLETED" // Отправлено в RMS StatusError = "ERROR" // Ошибка обработки ) // DraftInvoice - Черновик накладной type DraftInvoice struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` ChatID int64 `gorm:"index" json:"chat_id"` // ID чата в Telegram (кто прислал) SenderPhotoURL string `gorm:"type:text" json:"photo_url"` // Ссылка на фото (если нужно отобразить на фронте) Status string `gorm:"type:varchar(50);default:'PROCESSING'" json:"status"` // Данные для отправки в RMS (заполняются пользователем) DocumentNumber string `gorm:"type:varchar(100)" json:"document_number"` DateIncoming *time.Time `json:"date_incoming"` SupplierID *uuid.UUID `gorm:"type:uuid" json:"supplier_id"` StoreID *uuid.UUID `gorm:"type:uuid" json:"store_id"` Comment string `gorm:"type:text" json:"comment"` // Связь с созданной накладной (когда статус COMPLETED) RMSInvoiceID *uuid.UUID `gorm:"type:uuid" json:"rms_invoice_id"` Items []DraftInvoiceItem `gorm:"foreignKey:DraftID;constraint:OnDelete:CASCADE" json:"items"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // DraftInvoiceItem - Позиция черновика type DraftInvoiceItem struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` DraftID uuid.UUID `gorm:"type:uuid;not null;index" json:"draft_id"` // --- Результаты OCR (Исходные данные) --- RawName string `gorm:"type:varchar(255);not null" json:"raw_name"` // Текст с чека RawAmount decimal.Decimal `gorm:"type:numeric(19,4)" json:"raw_amount"` // Кол-во, которое увидел OCR RawPrice decimal.Decimal `gorm:"type:numeric(19,4)" json:"raw_price"` // Цена, которую увидел OCR // --- Результат Матчинга и Выбора пользователя --- ProductID *uuid.UUID `gorm:"type:uuid;index" json:"product_id"` Product *catalog.Product `gorm:"foreignKey:ProductID" json:"product,omitempty"` ContainerID *uuid.UUID `gorm:"type:uuid;index" json:"container_id"` Container *catalog.ProductContainer `gorm:"foreignKey:ContainerID" json:"container,omitempty"` // Финальные цифры, которые пойдут в накладную Quantity decimal.Decimal `gorm:"type:numeric(19,4);default:0" json:"quantity"` Price decimal.Decimal `gorm:"type:numeric(19,4);default:0" json:"price"` Sum decimal.Decimal `gorm:"type:numeric(19,4);default:0" json:"sum"` IsMatched bool `gorm:"default:false" json:"is_matched"` // Удалось ли системе найти пару автоматически } // Repository интерфейс type Repository interface { Create(draft *DraftInvoice) error GetByID(id uuid.UUID) (*DraftInvoice, error) Update(draft *DraftInvoice) error CreateItems(items []DraftInvoiceItem) error // UpdateItem обновляет конкретную строку (например, при ручном выборе товара) UpdateItem(itemID uuid.UUID, productID *uuid.UUID, containerID *uuid.UUID, qty, price decimal.Decimal) error Delete(id uuid.UUID) error }