package db import ( "fmt" "gestion/models" "gorm.io/gorm" ) func (d *Database) GetClientReferralBalance(username string) (float64, error) { var balance float64 err := d.GDB.Table("clients").Select("referral_balance").Where("username = ?", username).Scan(&balance).Error if err != nil { return 0, err } return balance, nil } func (d *Database) CreditClientReferral(username string, amount float64) error { if amount <= 0 { return fmt.Errorf("le montant doit être positif") } result := d.GDB.Model(&models.Client{}).Where("username = ?", username).Updates(map[string]any{ "referral_balance": gorm.Expr("referral_balance + ?", amount), }) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return fmt.Errorf("client non trouvé") } return nil } func (d *Database) DebitReferralBalance(username string, amount float64) error { if amount <= 0 { return nil } return d.GDB.Transaction(func(tx *gorm.DB) error { var balance float64 if err := tx.Raw(`SELECT referral_balance FROM clients WHERE username = ? FOR UPDATE`, username).Scan(&balance).Error; err != nil { return fmt.Errorf("client non trouvé") } if balance < amount { return fmt.Errorf("solde parrainage insuffisant (disponible: %.2f€)", balance) } return tx.Exec(`UPDATE clients SET referral_balance = referral_balance - ? WHERE username = ?`, amount, username).Error }) } func (d *Database) ResetClientReferralBalance(username string) error { result := d.GDB.Model(&models.Client{}).Where("username = ?", username).Update("referral_balance", 0) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return fmt.Errorf("client non trouvé") } return nil }