mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
82 lines
3.9 KiB
Go
82 lines
3.9 KiB
Go
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" // Ошибка обработки
|
||
StatusCanceled = "CANCELED" // Пользователь отменил
|
||
StatusDeleted = "DELETED" // Пользователь удалил
|
||
)
|
||
|
||
// 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"`
|
||
// Связь со складом для Preload
|
||
Store *catalog.Store `gorm:"foreignKey:StoreID" json:"store,omitempty"`
|
||
|
||
Comment string `gorm:"type:text" json:"comment"`
|
||
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
|
||
GetActive() ([]DraftInvoice, error)
|
||
}
|