diff --git a/pkg/models/contrato.go b/pkg/models/contrato.go index 979f8b1..9b59a10 100644 --- a/pkg/models/contrato.go +++ b/pkg/models/contrato.go @@ -80,21 +80,32 @@ func GetContratosProximosVencer(diasAntes int) ([]Contrato, error) { return items, nil } -func CreateContrato(c Contrato, servicioIDs []uint) error { +// syncContratoServicios sincroniza la tabla join contrato_servicios usando SQL directo +// para evitar que GORM intente hacer upsert de los servicios existentes. +func syncContratoServicios(contratoID uint, servicioIDs []uint) error { db := app.Http.Database.DB - if err := db.Create(&c).Error; err != nil { + if err := db.Exec("DELETE FROM contrato_servicios WHERE contrato_id = ?", contratoID).Error; err != nil { return err } - if len(servicioIDs) > 0 { - var servicios []Servicio - if err := db.Find(&servicios, servicioIDs).Error; err != nil { + for _, sid := range servicioIDs { + if err := db.Exec( + "INSERT INTO contrato_servicios (contrato_id, servicio_id) VALUES (?, ?) ON CONFLICT DO NOTHING", + contratoID, sid, + ).Error; err != nil { return err } - return db.Model(&c).Association("Servicios").Replace(servicios) } return nil } +func CreateContrato(c Contrato, servicioIDs []uint) error { + db := app.Http.Database.DB + if err := db.Omit("Servicios.*").Create(&c).Error; err != nil { + return err + } + return syncContratoServicios(c.ID, servicioIDs) +} + 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{}{ @@ -109,20 +120,17 @@ func UpdateContrato(c Contrato, servicioIDs []uint) error { return err } if servicioIDs != nil { - var servicios []Servicio - if err := db.Find(&servicios, servicioIDs).Error; err != nil { - return err - } - return db.Model(&Contrato{Model: gorm.Model{ID: c.ID}}).Association("Servicios").Replace(servicios) + return syncContratoServicios(c.ID, servicioIDs) } return nil } func DeleteContrato(id uint) error { + db := app.Http.Database.DB var c Contrato - if err := app.Http.Database.DB.First(&c, id).Error; err != nil { + if err := db.First(&c, id).Error; err != nil { return err } - app.Http.Database.DB.Model(&c).Association("Servicios").Clear() - return app.Http.Database.DB.Delete(&c).Error + db.Exec("DELETE FROM contrato_servicios WHERE contrato_id = ?", id) + return db.Delete(&c).Error }