This commit is contained in:
Lizandro Guarnizo
2026-06-04 22:49:16 -05:00
parent 72744a1325
commit 7329bac898
8 changed files with 176 additions and 18 deletions
+8
View File
@@ -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)
+28 -4
View File
@@ -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 {
+12
View File
@@ -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
}