feat(umind): vincula tenants a clientes y agrega planes con precios
Base para que el cliente administre uMind desde su portal y para el cobro por consumo. Todavía no cambia nada del comportamiento actual. - UmindTenant gana ClienteID (punteros, sin not null: los tenants creados antes del portal quedan sin asignar y el ALTER TABLE no falla sobre datos existentes) y PlanID. - GetUmindTenantsByClientes es fail-closed: sin clientes, no ve nada. - UmindPlan define el máximo de agentes y los precios por 1k tokens, por imagen OCR, por transcripción y la mensualidad, más un tope de consumo que solo avisa. CRUD para staff en /app/umind-planes. - El modelo va en AMBAS listas de AutoMigrate (main.go y migrations), no repetir el error de agregarlo solo en una. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
84506a98e2
commit
c69b904b03
+24
-2
@@ -127,6 +127,7 @@ func Migrate() {
|
||||
&models.UmindCanal{},
|
||||
&models.UmindConexion{},
|
||||
&models.UmindEventoLog{},
|
||||
&models.UmindPlan{},
|
||||
// API Keys de /api/v2 (token + IP obligatoria + scopes)
|
||||
&models.ApiKey{},
|
||||
// Integraciones: OCR y transcripción de audio (servicios propios)
|
||||
@@ -1326,12 +1327,33 @@ func SeedUmind() {
|
||||
db.Model(&sub).Updates(updates)
|
||||
}
|
||||
}
|
||||
// Planes de uMind: límite de agentes y precios por consumo. Solo staff.
|
||||
var subPlanes models.Submodules
|
||||
if err := db.Where("url = ?", "/app/umind-planes").First(&subPlanes).Error; err != nil {
|
||||
subPlanes = models.Submodules{
|
||||
Title: "Planes uMind",
|
||||
Description: "Límite de agentes y precios por consumo (IA, OCR, transcripción, mensualidad)",
|
||||
Url: "/app/umind-planes",
|
||||
ModuleId: modulo.ID,
|
||||
ModifiedAt: time.Now(),
|
||||
}
|
||||
if err := db.Create(&subPlanes).Error; err != nil {
|
||||
log.Printf("[SEED] Error creando submódulo 'Planes uMind': %v", err)
|
||||
} else {
|
||||
log.Printf("[SEED] Submódulo 'Planes uMind' creado")
|
||||
}
|
||||
}
|
||||
|
||||
var rol models.Roles
|
||||
if err := db.Where("name = ?", "Administrador").First(&rol).Error; err != nil {
|
||||
log.Printf("[SEED] Rol 'Administrador' no encontrado, se omite asignación: %v", err)
|
||||
} else {
|
||||
asignarSubmodulosSiFaltan(&rol, []models.Submodules{sub})
|
||||
log.Printf("[SEED] Submódulo 'uMind' asignado al rol 'Administrador'")
|
||||
subs := []models.Submodules{sub}
|
||||
if subPlanes.ID > 0 {
|
||||
subs = append(subs, subPlanes)
|
||||
}
|
||||
asignarSubmodulosSiFaltan(&rol, subs)
|
||||
log.Printf("[SEED] Submódulos de uMind asignados al rol 'Administrador'")
|
||||
}
|
||||
log.Println("[SEED] Seed de uMind completado.")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user