package db import ( "fmt" "log" ) func (d *Database) GetCommandCategories(commandID int) ([]string, error) { var categories []string err := d.GDB.Raw(` SELECT DISTINCT p.category FROM command_items ci JOIN products p ON p.id = ci.product_id WHERE ci.command_id = ? AND p.category IS NOT NULL AND p.category != ''`, commandID, ).Scan(&categories).Error if err != nil { return nil, fmt.Errorf("erreur lecture catégories commande %d: %w", commandID, err) } return categories, nil } func (d *Database) GetEligibleDeliverymenForCommand(commandID int) ([]string, error) { settings, err := d.GetSettings() if err != nil { log.Printf("⚠️ [DELIVERY_MODE] Erreur lecture settings: %v — fallback single", err) } allActive := func() ([]string, error) { livreurs, err := d.GetAllActiveDeliveryPersons() if err != nil { return nil, err } names := make([]string, len(livreurs)) for i, l := range livreurs { names[i] = l.Username } return names, nil } if settings.DeliveryMode.Mode != "category_based" || len(settings.DeliveryMode.CategoryRoutes) == 0 { return allActive() } categories, err := d.GetCommandCategories(commandID) if err != nil || len(categories) == 0 { log.Printf("⚠️ [DELIVERY_MODE] Cmd %d: catégories non trouvées — fallback single", commandID) return allActive() } catSet := make(map[string]bool, len(categories)) for _, c := range categories { catSet[c] = true } eligible := make(map[string]bool) for _, route := range settings.DeliveryMode.CategoryRoutes { for _, routeCat := range route.Categories { if catSet[routeCat] { eligible[route.DeliverymanUsername] = true break } } } if len(eligible) == 0 { log.Printf("⚠️ [DELIVERY_MODE] Cmd %d: aucun livreur pour catégories %v — fallback single", commandID, categories) return allActive() } result := make([]string, 0, len(eligible)) for u := range eligible { result = append(result, u) } log.Printf("🎯 [DELIVERY_MODE] Cmd %d: livreurs éligibles %v (catégories: %v)", commandID, result, categories) return result, nil }