chore: update
This commit is contained in:
@@ -399,7 +399,8 @@ func (d *Database) GetClientByTelephone(telephone string) (*models.Client, error
|
||||
// GetClientByUsername récupère un client par son username
|
||||
func (d *Database) GetClientByUsername(username string) (*models.Client, error) {
|
||||
client := &models.Client{}
|
||||
query := `SELECT id, username, password, nom, prenom, telephone, command, point, point_zipette, amende, must_change_password, created_at
|
||||
var pointsExtraJSON []byte
|
||||
query := `SELECT id, username, password, nom, prenom, telephone, command, point, point_zipette, amende, must_change_password, COALESCE(points_extra, '{}'::jsonb), created_at
|
||||
FROM clients WHERE username = $1`
|
||||
|
||||
err := d.QueryRow(query, username).Scan(
|
||||
@@ -414,6 +415,7 @@ func (d *Database) GetClientByUsername(username string) (*models.Client, error)
|
||||
&client.PointZipette,
|
||||
&client.Amende,
|
||||
&client.MustChangePassword,
|
||||
&pointsExtraJSON,
|
||||
&client.CreatedAt,
|
||||
)
|
||||
|
||||
@@ -424,6 +426,11 @@ func (d *Database) GetClientByUsername(username string) (*models.Client, error)
|
||||
return nil, fmt.Errorf("erreur lors de la récupération du client: %w", err)
|
||||
}
|
||||
|
||||
client.PointsExtra = map[string]int{}
|
||||
if len(pointsExtraJSON) > 0 {
|
||||
json.Unmarshal(pointsExtraJSON, &client.PointsExtra)
|
||||
}
|
||||
|
||||
return client, nil
|
||||
}
|
||||
|
||||
@@ -949,27 +956,38 @@ func (d *Database) CalculateAndAddPointsForCommandTx(tx *sql.Tx, commandID int,
|
||||
log.Printf("📊 [CalcPointsTx] Pool[%d] (%s): %.2f€", i, pools[i].Name, t)
|
||||
}
|
||||
|
||||
// ✅ ÉTAPE 2: Calculer les points par pool et mettre à jour les colonnes DB
|
||||
// Pool[0] → colonne `point`, Pool[1] → colonne `point_zipette`
|
||||
// ✅ ÉTAPE 2: Calculer les points pour tous les pools
|
||||
var totalPoints int
|
||||
var pointCategory string
|
||||
var result sql.Result
|
||||
|
||||
pts0 := CalcPointsFromTiers(poolTotals[0], pools[0].Tiers)
|
||||
pts1 := 0
|
||||
if len(pools) >= 2 {
|
||||
pts1 = CalcPointsFromTiers(poolTotals[1], pools[1].Tiers)
|
||||
poolPts := make([]int, len(pools))
|
||||
var categoryParts []string
|
||||
for i, pool := range pools {
|
||||
poolPts[i] = CalcPointsFromTiers(poolTotals[i], pool.Tiers)
|
||||
totalPoints += poolPts[i]
|
||||
if poolPts[i] > 0 {
|
||||
categoryParts = append(categoryParts, pool.Name)
|
||||
}
|
||||
}
|
||||
totalPoints = pts0 + pts1
|
||||
|
||||
// Pools supplémentaires (index 2+) → points_extra JSONB
|
||||
for i := 2; i < len(pools); i++ {
|
||||
ptsExtra := CalcPointsFromTiers(poolTotals[i], pools[i].Tiers)
|
||||
if ptsExtra == 0 {
|
||||
log.Printf("💰 [CalcPointsTx] points par pool: %v, total=%d", poolPts, totalPoints)
|
||||
|
||||
if totalPoints == 0 {
|
||||
return 0, "", nil
|
||||
}
|
||||
|
||||
if len(categoryParts) > 0 {
|
||||
pointCategory = strings.Join(categoryParts, " & ")
|
||||
} else {
|
||||
pointCategory = "points"
|
||||
}
|
||||
|
||||
// Écrire tous les pools dans points_extra[pool.Key] (stockage dynamique)
|
||||
// + maintenir les colonnes legacy point/point_zipette pour la compatibilité admin
|
||||
for i, pool := range pools {
|
||||
if poolPts[i] == 0 {
|
||||
continue
|
||||
}
|
||||
totalPoints += ptsExtra
|
||||
poolKey := pools[i].Key
|
||||
_, err = tx.Exec(`
|
||||
UPDATE clients
|
||||
SET points_extra = jsonb_set(
|
||||
@@ -978,50 +996,30 @@ func (d *Database) CalculateAndAddPointsForCommandTx(tx *sql.Tx, commandID int,
|
||||
to_jsonb(COALESCE((points_extra->>$2)::int, 0) + $3)
|
||||
), updated_at = CURRENT_TIMESTAMP
|
||||
WHERE username = $1
|
||||
`, username, poolKey, ptsExtra)
|
||||
`, username, pool.Key, poolPts[i])
|
||||
if err != nil {
|
||||
log.Printf("❌ [CalcPointsTx] Erreur UPDATE points_extra pool[%d]: %v", i, err)
|
||||
log.Printf("❌ [CalcPointsTx] Erreur UPDATE points_extra pool[%d] (%s): %v", i, pool.Key, err)
|
||||
return 0, "", fmt.Errorf("erreur mise à jour points pool[%d]: %w", i, err)
|
||||
}
|
||||
log.Printf("💰 [CalcPointsTx] pool[%d] (%s): +%d pts → points_extra", i, pools[i].Name, ptsExtra)
|
||||
log.Printf("💰 [CalcPointsTx] pool[%d] (%s / key=%s): +%d pts", i, pool.Name, pool.Key, poolPts[i])
|
||||
}
|
||||
|
||||
log.Printf("💰 [CalcPointsTx] pool[0]=%d pts, pool[1]=%d pts, total=%d pts", pts0, pts1, totalPoints)
|
||||
|
||||
if totalPoints == 0 {
|
||||
return 0, "", nil
|
||||
// Maintenir colonnes legacy pour affichage admin
|
||||
pts0 := poolPts[0]
|
||||
pts1 := 0
|
||||
if len(pools) >= 2 {
|
||||
pts1 = poolPts[1]
|
||||
}
|
||||
|
||||
var categoryParts []string
|
||||
if pts0 > 0 {
|
||||
categoryParts = append(categoryParts, pools[0].Name)
|
||||
}
|
||||
if pts1 > 0 {
|
||||
categoryParts = append(categoryParts, pools[1].Name)
|
||||
}
|
||||
if len(categoryParts) > 0 {
|
||||
pointCategory = strings.Join(categoryParts, " & ")
|
||||
var legacyErr error
|
||||
var result sql.Result
|
||||
if pts1 == 0 {
|
||||
result, legacyErr = tx.Exec(`UPDATE clients SET point = point + $1, updated_at = CURRENT_TIMESTAMP WHERE username = $2`, pts0, username)
|
||||
} else {
|
||||
pointCategory = "points"
|
||||
result, legacyErr = tx.Exec(`UPDATE clients SET point = point + $1, point_zipette = point_zipette + $2, updated_at = CURRENT_TIMESTAMP WHERE username = $3`, pts0, pts1, username)
|
||||
}
|
||||
|
||||
if len(pools) == 1 || pts1 == 0 {
|
||||
result, err = tx.Exec(`
|
||||
UPDATE clients
|
||||
SET point = point + $1, updated_at = CURRENT_TIMESTAMP
|
||||
WHERE username = $2
|
||||
`, pts0, username)
|
||||
} else {
|
||||
result, err = tx.Exec(`
|
||||
UPDATE clients
|
||||
SET point = point + $1, point_zipette = point_zipette + $2, updated_at = CURRENT_TIMESTAMP
|
||||
WHERE username = $3
|
||||
`, pts0, pts1, username)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
log.Printf("❌ [CalcPointsTx] Erreur UPDATE points: %v", err)
|
||||
return 0, "", fmt.Errorf("erreur mise à jour points: %w", err)
|
||||
if legacyErr != nil {
|
||||
log.Printf("❌ [CalcPointsTx] Erreur UPDATE colonnes legacy: %v", legacyErr)
|
||||
return 0, "", fmt.Errorf("erreur mise à jour points: %w", legacyErr)
|
||||
}
|
||||
affected, _ := result.RowsAffected()
|
||||
if affected == 0 {
|
||||
|
||||
@@ -2,6 +2,7 @@ package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
@@ -161,11 +162,42 @@ func InitDB() *Database {
|
||||
log.Fatalf("❌ Erreur migration commandes.referral_used: %v", err)
|
||||
}
|
||||
|
||||
// Migration: points extra pour les pools de points supplémentaires (pool[2+])
|
||||
// Migration: points extra pour tous les pools de points (stockage dynamique par clé)
|
||||
if _, err = database.Exec(`ALTER TABLE clients ADD COLUMN IF NOT EXISTS points_extra JSONB NOT NULL DEFAULT '{}'::jsonb`); err != nil {
|
||||
log.Fatalf("❌ Erreur migration clients.points_extra: %v", err)
|
||||
}
|
||||
|
||||
// Migration: copier point/point_zipette → points_extra[pool.Key] selon les clés admin
|
||||
{
|
||||
var poolsJSON string
|
||||
_ = database.QueryRow(`SELECT value FROM app_settings WHERE key = 'points_pools'`).Scan(&poolsJSON)
|
||||
if poolsJSON != "" {
|
||||
var pools []struct {
|
||||
Key string `json:"key"`
|
||||
}
|
||||
if jsonErr := json.Unmarshal([]byte(poolsJSON), &pools); jsonErr == nil {
|
||||
if len(pools) > 0 && pools[0].Key != "" {
|
||||
k0 := pools[0].Key
|
||||
if _, mErr := database.Exec(`UPDATE clients SET points_extra = points_extra || jsonb_build_object($1::text, point) WHERE point > 0 AND NOT (points_extra ? $1)`, k0); mErr != nil {
|
||||
log.Printf("⚠️ Migration points_extra pool[0] (%s): %v", k0, mErr)
|
||||
} else {
|
||||
log.Printf("✅ Migration points_extra pool[0] key=%s", k0)
|
||||
}
|
||||
}
|
||||
if len(pools) > 1 && pools[1].Key != "" {
|
||||
k1 := pools[1].Key
|
||||
if _, mErr := database.Exec(`UPDATE clients SET points_extra = points_extra || jsonb_build_object($1::text, point_zipette) WHERE point_zipette > 0 AND NOT (points_extra ? $1)`, k1); mErr != nil {
|
||||
log.Printf("⚠️ Migration points_extra pool[1] (%s): %v", k1, mErr)
|
||||
} else {
|
||||
log.Printf("✅ Migration points_extra pool[1] key=%s", k1)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.Printf("ℹ️ Migration points_extra: aucun pool configuré (app_settings vide)")
|
||||
}
|
||||
}
|
||||
|
||||
// Lancer le nettoyage périodique des tokens expirés
|
||||
go database.cleanExpiredTokensPeriodically()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user