package db import ( "fmt" "gestion/models" ) func (d *Database) SetClientParrain(clientUsername, parrainUsername string) error { result := d.GDB.Model(&models.Client{}). Where("username = ? AND (parrain IS NULL OR parrain = '')", clientUsername). Update("parrain", parrainUsername) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return fmt.Errorf("client introuvable ou parrain déjà défini") } return nil } func (d *Database) GetClientParrain(clientUsername string) (string, error) { var parrain string err := d.GDB.Table("clients"). Select("parrain"). Where("username = ?", clientUsername). Scan(&parrain).Error return parrain, err } func (d *Database) GetClientsByParrain(parrainUsername string) ([]models.Client, error) { var clients []models.Client err := d.GDB. Where("parrain = ?", parrainUsername). Find(&clients).Error return clients, err } func (d *Database) GetParrainStats() ([]map[string]any, error) { var rows []struct { Parrain string `gorm:"column:parrain"` FilleulCount int `gorm:"column:filleul_count"` ReferralBalance float64 `gorm:"column:referral_balance"` } err := d.GDB.Raw(` SELECT c.parrain, COUNT(c.username) AS filleul_count, p.referral_balance FROM clients c JOIN clients p ON p.username = c.parrain WHERE c.parrain IS NOT NULL AND c.parrain <> '' GROUP BY c.parrain, p.referral_balance ORDER BY filleul_count DESC `).Scan(&rows).Error if err != nil { return nil, err } result := make([]map[string]any, 0, len(rows)) for _, r := range rows { result = append(result, map[string]any{ "parrain": r.Parrain, "filleul_count": r.FilleulCount, "referral_balance": r.ReferralBalance, }) } return result, nil }