package handlers import ( "gestion/db" "regexp" ) var postalCodeRe = regexp.MustCompile(`\b(\d{5})\b`) // postalSet convertit une slice de codes en set pour lookup O(1). func postalSet(codes []string) map[string]struct{} { m := make(map[string]struct{}, len(codes)) for _, c := range codes { m[c] = struct{}{} } return m } // extractPostalCode extrait le premier code postal à 5 chiffres d'une adresse. func extractPostalCode(address string) string { m := postalCodeRe.FindStringSubmatch(address) if len(m) < 2 { return "" } return m[1] } // zoneCheckResult est le résultat de la vérification de zone. type zoneCheckResult struct { PostalCode string ZoneName string MinAmount float64 OK bool } // checkDeliveryZone vérifie si le total respecte le minimum de la zone de l'adresse. // Les zones sont lues depuis la DB (settings.PostalZones). // Code postal introuvable → OK = false (refus). // Code postal hors de toutes les zones → OK = false (refus). func checkDeliveryZone(deliveryAddress string, total float64, zones []db.PostalZone) zoneCheckResult { code := extractPostalCode(deliveryAddress) if code == "" { return zoneCheckResult{PostalCode: "", ZoneName: "inconnue", MinAmount: 0, OK: false} } for _, zone := range zones { set := postalSet(zone.Codes) if _, found := set[code]; found { return zoneCheckResult{ PostalCode: code, ZoneName: zone.Name, MinAmount: zone.MinAmount, OK: total >= zone.MinAmount, } } } return zoneCheckResult{PostalCode: code, ZoneName: "hors zone", MinAmount: 0, OK: false} }