104 lines
2.8 KiB
Go
104 lines
2.8 KiB
Go
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
|
|
}
|