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 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 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 return err
} }
if len(servicioIDs) > 0 { for _, sid := range servicioIDs {
var servicios []Servicio if err := db.Exec(
if err := db.Find(&servicios, servicioIDs).Error; err != nil { "INSERT INTO contrato_servicios (contrato_id, servicio_id) VALUES (?, ?) ON CONFLICT DO NOTHING",
contratoID, sid,
).Error; err != nil {
return err return err
} }
return db.Model(&c).Association("Servicios").Replace(servicios)
} }
return nil 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 { func UpdateContrato(c Contrato, servicioIDs []uint) error {
db := app.Http.Database.DB db := app.Http.Database.DB
if err := db.Model(&Contrato{}).Where("id = ?", c.ID).Updates(map[string]interface{}{ 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 return err
} }
if servicioIDs != nil { if servicioIDs != nil {
var servicios []Servicio return syncContratoServicios(c.ID, servicioIDs)
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 nil return nil
} }
func DeleteContrato(id uint) error { func DeleteContrato(id uint) error {
db := app.Http.Database.DB
var c Contrato 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 return err
} }
app.Http.Database.DB.Model(&c).Association("Servicios").Clear() db.Exec("DELETE FROM contrato_servicios WHERE contrato_id = ?", id)
return app.Http.Database.DB.Delete(&c).Error return db.Delete(&c).Error
} }