fix: usar SQL directo en join table contrato_servicios para evitar upsert de GORM
This commit is contained in:
+22
-14
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user