151 lines
4.4 KiB
Go
151 lines
4.4 KiB
Go
// ============================================
|
|
// db/commands_history.go
|
|
// ============================================
|
|
// Fonctions pour l'historique des commandes terminées
|
|
|
|
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"maps"
|
|
"strconv"
|
|
)
|
|
|
|
// GetCompletedCommandsByUsername récupère toutes les commandes terminées (approved) d'un utilisateur
|
|
func (d *Database) GetCompletedCommandsByUsername(username string) ([]map[string]any, error) {
|
|
query := `
|
|
SELECT
|
|
id,
|
|
client_order_id AS client_order_number,
|
|
username,
|
|
status,
|
|
adresse,
|
|
total_prix::float8 as total_prix,
|
|
livreur_assign,
|
|
created_at,
|
|
updated_at
|
|
FROM commandes
|
|
WHERE username = ? AND status = 'approved'
|
|
ORDER BY created_at DESC
|
|
`
|
|
|
|
var commands []map[string]any
|
|
if err := d.GDB.Raw(query, username).Scan(&commands).Error; err != nil {
|
|
log.Printf("❌ [GetCompletedCommands] Erreur query: %v", err)
|
|
return nil, fmt.Errorf("erreur lors de la récupération des commandes terminées: %w", err)
|
|
}
|
|
return commands, nil
|
|
}
|
|
|
|
// GetCompletedCommandsWithItems récupère les commandes terminées avec leurs items
|
|
func (d *Database) GetCompletedCommandsWithItems(username string) ([]map[string]any, error) {
|
|
commands, err := d.GetCompletedCommandsByUsername(username)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var enrichedCommands []map[string]any
|
|
|
|
for _, command := range commands {
|
|
commandID, _ := strconv.Atoi(fmt.Sprintf("%v", command["id"]))
|
|
if commandID == 0 {
|
|
continue
|
|
}
|
|
|
|
items, err := d.GetCommandItems(commandID)
|
|
if err != nil {
|
|
log.Printf("⚠️ [GetCompletedWithItems] Erreur items pour cmd %d: %v", commandID, err)
|
|
items = []map[string]any{}
|
|
}
|
|
|
|
enrichedCommand := make(map[string]any)
|
|
maps.Copy(enrichedCommand, command)
|
|
enrichedCommand["items"] = items
|
|
enrichedCommand["items_count"] = len(items)
|
|
|
|
enrichedCommands = append(enrichedCommands, enrichedCommand)
|
|
}
|
|
|
|
return enrichedCommands, nil
|
|
}
|
|
|
|
// GetCommandsStatsByUsername récupère les statistiques des commandes d'un utilisateur
|
|
func (d *Database) GetCommandsStatsByUsername(username string) (map[string]any, error) {
|
|
query := `
|
|
SELECT
|
|
COUNT(*) FILTER (WHERE status = 'approved') as approved_count,
|
|
COUNT(*) FILTER (WHERE status = 'pending') as pending_count,
|
|
COUNT(*) FILTER (WHERE status = 'assigned') as assigned_count,
|
|
COUNT(*) FILTER (WHERE status = 'en_route') as en_route_count,
|
|
COUNT(*) FILTER (WHERE status = 'livre') as livre_count,
|
|
COUNT(*) FILTER (WHERE status = 'cancelled') as cancelled_count,
|
|
COUNT(*) as total_count,
|
|
COALESCE(SUM(total_prix) FILTER (WHERE status = 'approved'), 0) as total_spent
|
|
FROM commandes
|
|
WHERE username = ?
|
|
`
|
|
|
|
var result map[string]any
|
|
if err := d.GDB.Raw(query, username).Scan(&result).Error; err != nil {
|
|
log.Printf("❌ [GetCommandsStats] Erreur: %v", err)
|
|
return nil, fmt.Errorf("erreur lors de la récupération des statistiques: %w", err)
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// GetCommandsByStatus récupère les commandes d'un utilisateur par statut
|
|
func (d *Database) GetCommandsByStatus(username, status string) ([]map[string]any, error) {
|
|
log.Printf("📋 [GetCommandsByStatus] START - username=%s, status=%s", username, status)
|
|
|
|
query := `
|
|
SELECT
|
|
id,
|
|
client_order_id AS client_order_number,
|
|
username,
|
|
status,
|
|
adresse,
|
|
total_prix::float8 as total_prix,
|
|
livreur_assign,
|
|
created_at,
|
|
updated_at
|
|
FROM commandes
|
|
WHERE username = ? AND status = ?
|
|
ORDER BY created_at DESC
|
|
`
|
|
|
|
var commands []map[string]any
|
|
if err := d.GDB.Raw(query, username, status).Scan(&commands).Error; err != nil {
|
|
return nil, fmt.Errorf("erreur lors de la récupération des commandes: %w", err)
|
|
}
|
|
return commands, nil
|
|
}
|
|
|
|
// GetRecentCompletedOrders récupère les N dernières commandes terminées d'un utilisateur
|
|
func (d *Database) GetRecentCompletedOrders(username string, limit int) ([]map[string]any, error) {
|
|
query := `
|
|
SELECT
|
|
id,
|
|
client_order_id AS client_order_number,
|
|
username,
|
|
status,
|
|
adresse,
|
|
total_prix::float8 as total_prix,
|
|
livreur_assign,
|
|
created_at,
|
|
updated_at
|
|
FROM commandes
|
|
WHERE username = ? AND status = 'approved'
|
|
ORDER BY created_at DESC
|
|
LIMIT ?
|
|
`
|
|
|
|
var commands []map[string]any
|
|
if err := d.GDB.Raw(query, username, limit).Scan(&commands).Error; err != nil {
|
|
log.Printf("❌ [GetRecentCompleted] Erreur query: %v", err)
|
|
return nil, fmt.Errorf("erreur lors de la récupération: %w", err)
|
|
}
|
|
return commands, nil
|
|
}
|