Renamed module path git.mchus.pro/mchus/quoteforge → git.mchus.pro/mchus/priceforge, renamed package quoteforge → priceforge, moved binary from cmd/qfs to cmd/pfs.
94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
package models
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type AlertType string
|
|
|
|
const (
|
|
AlertHighDemandStalePrice AlertType = "high_demand_stale_price"
|
|
AlertPriceSpike AlertType = "price_spike"
|
|
AlertPriceDrop AlertType = "price_drop"
|
|
AlertNoRecentQuotes AlertType = "no_recent_quotes"
|
|
AlertTrendingNoPrice AlertType = "trending_no_price"
|
|
)
|
|
|
|
type AlertSeverity string
|
|
|
|
const (
|
|
SeverityLow AlertSeverity = "low"
|
|
SeverityMedium AlertSeverity = "medium"
|
|
SeverityHigh AlertSeverity = "high"
|
|
SeverityCritical AlertSeverity = "critical"
|
|
)
|
|
|
|
type AlertStatus string
|
|
|
|
const (
|
|
AlertStatusNew AlertStatus = "new"
|
|
AlertStatusAcknowledged AlertStatus = "acknowledged"
|
|
AlertStatusResolved AlertStatus = "resolved"
|
|
AlertStatusIgnored AlertStatus = "ignored"
|
|
)
|
|
|
|
type AlertDetails map[string]interface{}
|
|
|
|
func (d AlertDetails) Value() (driver.Value, error) {
|
|
return json.Marshal(d)
|
|
}
|
|
|
|
func (d *AlertDetails) Scan(value interface{}) error {
|
|
if value == nil {
|
|
*d = make(AlertDetails)
|
|
return nil
|
|
}
|
|
bytes, ok := value.([]byte)
|
|
if !ok {
|
|
return errors.New("type assertion to []byte failed")
|
|
}
|
|
return json.Unmarshal(bytes, d)
|
|
}
|
|
|
|
type PricingAlert struct {
|
|
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
|
LotName string `gorm:"size:255;not null" json:"lot_name"`
|
|
AlertType AlertType `gorm:"type:enum('high_demand_stale_price','price_spike','price_drop','no_recent_quotes','trending_no_price');not null" json:"alert_type"`
|
|
Severity AlertSeverity `gorm:"type:enum('low','medium','high','critical');default:'medium'" json:"severity"`
|
|
Message string `gorm:"type:text;not null" json:"message"`
|
|
Details AlertDetails `gorm:"type:json" json:"details"`
|
|
Status AlertStatus `gorm:"type:enum('new','acknowledged','resolved','ignored');default:'new'" json:"status"`
|
|
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
|
}
|
|
|
|
func (PricingAlert) TableName() string {
|
|
return "qt_pricing_alerts"
|
|
}
|
|
|
|
type TrendDirection string
|
|
|
|
const (
|
|
TrendUp TrendDirection = "up"
|
|
TrendStable TrendDirection = "stable"
|
|
TrendDown TrendDirection = "down"
|
|
)
|
|
|
|
type ComponentUsageStats struct {
|
|
LotName string `gorm:"column:lot_name;primaryKey;size:255" json:"lot_name"`
|
|
QuotesTotal int `gorm:"default:0" json:"quotes_total"`
|
|
QuotesLast30d int `gorm:"default:0" json:"quotes_last_30d"`
|
|
QuotesLast7d int `gorm:"default:0" json:"quotes_last_7d"`
|
|
TotalQuantity int `gorm:"default:0" json:"total_quantity"`
|
|
TotalRevenue float64 `gorm:"type:decimal(14,2);default:0" json:"total_revenue"`
|
|
TrendDirection TrendDirection `gorm:"type:enum('up','stable','down');default:'stable'" json:"trend_direction"`
|
|
TrendPercent float64 `gorm:"type:decimal(5,2);default:0" json:"trend_percent"`
|
|
LastUsedAt *time.Time `json:"last_used_at"`
|
|
}
|
|
|
|
func (ComponentUsageStats) TableName() string {
|
|
return "qt_component_usage_stats"
|
|
}
|