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
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user