fix: usar SQL directo en join table contrato_servicios para evitar upsert de GORM

This commit is contained in:
Lizandro Guarnizo
2026-04-30 22:24:26 -05:00
parent e751a9f894
commit 92ef6d48e8
+22 -14
View File
@@ -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
}