61 lines
1.9 KiB
Go
61 lines
1.9 KiB
Go
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
|
|
}
|