package db import ( "fmt" "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.Exec(`UPDATE clients SET referral_balance = referral_balance + ? WHERE username = ?`, amount, username) 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) UseClientReferralBalance(tx *gorm.DB, username string, amount float64) error { if amount <= 0 { return nil } 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 }