60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
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}
|
|
}
|