Files
projet_gestion_commande/backend/gestion/db/db_parrain.go
T

70 lines
1.7 KiB
Go

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
}