fix: manage quantity && update geoloca
This commit is contained in:
@@ -287,20 +287,46 @@ func (d *Database) GetBasketItemCount(username string) (int, error) {
|
||||
return result.Count, nil
|
||||
}
|
||||
|
||||
// UpdateBasketItemQuantity met à jour la quantité d'un item du panier
|
||||
func (d *Database) UpdateBasketItemQuantity(basketID int, quantity float64) error {
|
||||
if quantity <= 0 {
|
||||
return fmt.Errorf("la quantité doit être supérieure à 0")
|
||||
func (d *Database) UpdateBasketItemQuantity(basketID int, newQuantity float64) error {
|
||||
if newQuantity <= 0 {
|
||||
return fmt.Errorf("quantité invalide")
|
||||
}
|
||||
result := d.GDB.Exec(`UPDATE baskets SET quantity = ?, created_at = CURRENT_TIMESTAMP WHERE id = ?`,
|
||||
quantity, basketID)
|
||||
if result.Error != nil {
|
||||
return fmt.Errorf("erreur lors de la mise à jour de la quantité: %w", result.Error)
|
||||
}
|
||||
if result.RowsAffected == 0 {
|
||||
return fmt.Errorf("produit non trouvé dans le panier")
|
||||
}
|
||||
return nil
|
||||
return d.GDB.Transaction(func(tx *gorm.DB) error {
|
||||
var item struct {
|
||||
ProductID int `gorm:"column:product_id"`
|
||||
Quantity float64 `gorm:"column:quantity"`
|
||||
}
|
||||
if err := tx.Raw(`SELECT product_id, quantity FROM baskets WHERE id = ? FOR UPDATE`, basketID).Scan(&item).Error; err != nil {
|
||||
return fmt.Errorf("produit non trouvé: %w", err)
|
||||
}
|
||||
if item.ProductID == 0 {
|
||||
return fmt.Errorf("panier item introuvable: %d", basketID)
|
||||
}
|
||||
|
||||
diff := newQuantity - item.Quantity
|
||||
|
||||
if diff > 0 {
|
||||
result := tx.Exec(`UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?`,
|
||||
diff, item.ProductID, diff)
|
||||
if result.Error != nil {
|
||||
return fmt.Errorf("erreur stock: %w", result.Error)
|
||||
}
|
||||
if result.RowsAffected == 0 {
|
||||
return fmt.Errorf("stock insuffisant")
|
||||
}
|
||||
} else if diff < 0 {
|
||||
if err := tx.Exec(`UPDATE products SET stock = stock + ? WHERE id = ?`,
|
||||
-diff, item.ProductID).Error; err != nil {
|
||||
return fmt.Errorf("erreur stock: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := tx.Exec(`UPDATE baskets SET quantity = ? WHERE id = ?`,
|
||||
newQuantity, basketID).Error; err != nil {
|
||||
return fmt.Errorf("erreur panier: %w", err)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// ExtendBasketReservations prolonge les réservations
|
||||
|
||||
Reference in New Issue
Block a user