From 7329bac898c78a96833605a2d8599cf85163e221 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 4 Jun 2026 22:49:16 -0500 Subject: [PATCH] up --- pkg/models/ai_config.go | 8 ++ pkg/models/contrato.go | 32 ++++++- pkg/models/conx_db.go | 12 +++ resources/views/renovaciones/contratos.html | 94 +++++++++++++++++++-- rest/controllers/ai_config_controller.go | 9 ++ rest/controllers/contrato_controller.go | 28 ++++-- rest/controllers/conx_db_controller.go | 9 ++ rest/routes/user.go | 2 + 8 files changed, 176 insertions(+), 18 deletions(-) diff --git a/pkg/models/ai_config.go b/pkg/models/ai_config.go index 3ebe9ed..502d8e6 100644 --- a/pkg/models/ai_config.go +++ b/pkg/models/ai_config.go @@ -95,6 +95,14 @@ func JoinModulos(modules []string) string { return strings.Join(clean, ",") } +func GetAiConfigSelect() ([]AiConfig, error) { + var items []AiConfig + if err := app.Http.Database.DB.Model(&AiConfig{}).Select("id, nombre, provider").Order("nombre ASC").Find(&items).Error; err != nil { + return nil, err + } + return items, nil +} + // GetAiConfigForService retorna la config activa asignada al módulo indicado. // Lógica de prioridad: // 1. Config activa con modulo conteniendo service (puede ser comma-separated) diff --git a/pkg/models/contrato.go b/pkg/models/contrato.go index 0e24d99..ad03489 100644 --- a/pkg/models/contrato.go +++ b/pkg/models/contrato.go @@ -20,6 +20,13 @@ type Contrato struct { Estado string `json:"estado" gorm:"column:estado;default:'activo'"` // activo | vencido | cancelado | renovado AutoRenovar bool `json:"auto_renovar" gorm:"column:auto_renovar;default:false"` Notas string `json:"notas" gorm:"column:notas"` + // Infraestructura asociada (opcional) + ServidorID *uint `json:"servidor_id" gorm:"column:servidor_id"` + Servidor Servidor `json:"servidor" gorm:"foreignKey:ServidorID"` + ConxDbID *uint `json:"conx_db_id" gorm:"column:conx_db_id"` + ConxDb ConxDb `json:"conx_db" gorm:"foreignKey:ConxDbID"` + AiConfigID *uint `json:"ai_config_id" gorm:"column:ai_config_id"` + AiConfig AiConfig `json:"ai_config" gorm:"foreignKey:AiConfigID"` // Enlace de pago Bold: único por ciclo de pago. // Se reutiliza en múltiples notificaciones del mismo ciclo. // Se anula (vacía) cuando SALE_APPROVED llega y se registra el pago. @@ -36,7 +43,8 @@ func GetAllContratos(limit, offset int, search, estado string) ([]Contrato, int6 var items []Contrato var total int64 db := app.Http.Database.DB.Model(&Contrato{}). - Preload("Cliente").Preload("Servicios") + Preload("Cliente").Preload("Servicios"). + Preload("Servidor").Preload("ConxDb").Preload("AiConfig") if search != "" { db = db.Joins("JOIN clientes ON clientes.id = contratos.cliente_id"). Where("clientes.nombre ILIKE ? OR clientes.empresa ILIKE ?", @@ -56,7 +64,7 @@ func GetAllContratos(limit, offset int, search, estado string) ([]Contrato, int6 func GetContratoByID(id uint) (*Contrato, error) { var item Contrato - if err := app.Http.Database.DB.Preload("Cliente").Preload("Servicios").First(&item, id).Error; err != nil { + if err := app.Http.Database.DB.Preload("Cliente").Preload("Servicios").Preload("Servidor").Preload("ConxDb").Preload("AiConfig").First(&item, id).Error; err != nil { return nil, err } return &item, nil @@ -156,7 +164,7 @@ func CreateContrato(c Contrato, servicioIDs []uint) error { func UpdateContrato(c Contrato, servicioIDs []uint) error { db := app.Http.Database.DB - if err := db.Model(&Contrato{}).Where("id = ?", c.ID).Updates(map[string]interface{}{ + updates := map[string]interface{}{ "cliente_id": c.ClienteID, "fecha_inicio": c.FechaInicio, "fecha_vencimiento": c.FechaVencimiento, @@ -165,7 +173,23 @@ func UpdateContrato(c Contrato, servicioIDs []uint) error { "estado": c.Estado, "auto_renovar": c.AutoRenovar, "notas": c.Notas, - }).Error; err != nil { + } + if c.ServidorID != nil { + updates["servidor_id"] = *c.ServidorID + } else { + updates["servidor_id"] = nil + } + if c.ConxDbID != nil { + updates["conx_db_id"] = *c.ConxDbID + } else { + updates["conx_db_id"] = nil + } + if c.AiConfigID != nil { + updates["ai_config_id"] = *c.AiConfigID + } else { + updates["ai_config_id"] = nil + } + if err := db.Model(&Contrato{}).Where("id = ?", c.ID).Updates(updates).Error; err != nil { return err } if servicioIDs != nil { diff --git a/pkg/models/conx_db.go b/pkg/models/conx_db.go index bf01e27..4eaa4fe 100755 --- a/pkg/models/conx_db.go +++ b/pkg/models/conx_db.go @@ -88,3 +88,15 @@ func DeleteConxDb(conxDb ConxDb) error { } return nil } + +func GetConxDbSelect(servidorID string) ([]ConxDb, error) { + var items []ConxDb + db := app.Http.Database.DB.Model(&ConxDb{}).Select("id, nombre, servidor_id").Order("nombre ASC") + if servidorID != "" { + db = db.Where("servidor_id = ?", servidorID) + } + if err := db.Find(&items).Error; err != nil { + return nil, err + } + return items, nil +} diff --git a/resources/views/renovaciones/contratos.html b/resources/views/renovaciones/contratos.html index 56da402..8e6ee48 100644 --- a/resources/views/renovaciones/contratos.html +++ b/resources/views/renovaciones/contratos.html @@ -29,6 +29,7 @@
Infraestructura (opcional)
+Sin BD para este servidor
+