package db import ( "database/sql" "fmt" "gestion/models" "gorm.io/gorm" ) 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 } // SetClientParrainAndCredit assigne un parrain à un client et crédite le parrain // dans une seule transaction, pour éviter un lien parrain enregistré sans le crédit associé. func (d *Database) SetClientParrainAndCredit(clientUsername, parrainUsername string, creditAmount float64) error { return d.GDB.Transaction(func(tx *gorm.DB) error { result := tx.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") } if creditAmount > 0 { result = tx.Model(&models.Client{}).Where("username = ?", parrainUsername). Updates(map[string]any{"referral_balance": gorm.Expr("referral_balance + ?", creditAmount)}) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return fmt.Errorf("parrain non trouvé") } } return nil }) } func (d *Database) GetClientParrain(clientUsername string) (string, error) { var parrain sql.NullString err := d.GDB.Table("clients"). Select("parrain"). Where("username = ?", clientUsername). Scan(&parrain).Error if err != nil { return "", err } return parrain.String, nil } 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 }