package models import ( "github.com/sujit-baniya/fiber-boilerplate/app" "gorm.io/gorm" ) // UmindPlan define qué puede hacer un tenant y a qué precio. Los precios se // copian a cada UmindUso al momento de registrarlo, así que subir un precio // nunca revalúa consumo ya facturado ni pendiente. type UmindPlan struct { gorm.Model Nombre string `json:"nombre" gorm:"column:nombre;size:100;not null"` MaxAgentes int `json:"max_agentes" gorm:"column:max_agentes;default:1"` // 0 = ilimitado PrecioMensual float64 `json:"precio_mensual" gorm:"column:precio_mensual;default:0"` PrecioPor1kTokens float64 `json:"precio_por_1k_tokens" gorm:"column:precio_por_1k_tokens;default:0"` PrecioPorOCR float64 `json:"precio_por_ocr" gorm:"column:precio_por_ocr;default:0"` PrecioPorTranscripcion float64 `json:"precio_por_transcripcion" gorm:"column:precio_por_transcripcion;default:0"` Moneda string `json:"moneda" gorm:"column:moneda;size:3;default:'COP'"` // TopeConsumoMensual solo dispara un aviso al superarse — no corta el // servicio. 0 = sin tope. TopeConsumoMensual float64 `json:"tope_consumo_mensual" gorm:"column:tope_consumo_mensual;default:0"` Activo bool `json:"activo" gorm:"column:activo;default:true"` } func (UmindPlan) TableName() string { return "umind_planes" } func CreateUmindPlan(p *UmindPlan) error { return app.Http.Database.DB.Create(p).Error } func GetUmindPlanes() ([]UmindPlan, error) { var items []UmindPlan err := app.Http.Database.DB.Order("id ASC").Find(&items).Error return items, err } func GetUmindPlanByID(id uint) (*UmindPlan, error) { var p UmindPlan if err := app.Http.Database.DB.First(&p, id).Error; err != nil { return nil, err } return &p, nil } func UpdateUmindPlan(id uint, updates map[string]interface{}) error { return app.Http.Database.DB.Model(&UmindPlan{}).Where("id = ?", id).Updates(updates).Error } func DeleteUmindPlan(id uint) error { return app.Http.Database.DB.Delete(&UmindPlan{}, id).Error } // GetPlanDeTenant devuelve el plan del tenant, o nil si no tiene uno asignado // (tenants viejos). Los llamadores tratan nil como "sin límites ni precios". func GetPlanDeTenant(tenantID uint) *UmindPlan { t, err := GetUmindTenantByID(tenantID) if err != nil || t.PlanID == nil { return nil } p, err := GetUmindPlanByID(*t.PlanID) if err != nil { return nil } return p }