This commit is contained in:
@@ -73,8 +73,47 @@ func validateAddress(address string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// updateCommandDestinationCoords regéocode l'adresse et met à jour
|
||||
// dest_latitude/dest_longitude après tout changement d'adresse de livraison.
|
||||
// Sans cet appel, ces coordonnées restent celles de l'ANCIENNE adresse
|
||||
// (géocodées une seule fois à l'assignation) : la vérification GPS de
|
||||
// handlers/deleviry.go compare alors la position réelle du livreur à un point
|
||||
// périmé et peut refuser à tort une validation "trop loin de la destination"
|
||||
// alors que le livreur est bien arrivé à la nouvelle adresse. En cas d'échec
|
||||
// de géocodage, on réinitialise les coordonnées plutôt que de laisser
|
||||
// l'ancienne valeur périmée : le contrôle GPS est alors ignoré (comportement
|
||||
// déjà prévu quand dest_latitude/dest_longitude sont absentes) au lieu de
|
||||
// bloquer sur un point qui ne correspond plus à l'adresse réelle.
|
||||
func updateCommandDestinationCoords(database *db.Database, geoService *services.GeoService, commandID int, address string) {
|
||||
if geoService == nil || strings.TrimSpace(address) == "" {
|
||||
return
|
||||
}
|
||||
|
||||
location, err := geoService.GeocodeAddress(address)
|
||||
if err != nil || location == nil {
|
||||
log.Printf("⚠️ [ADDR_GEOCODE] Échec géocodage cmd %d (%q): %v — coordonnées de destination réinitialisées", commandID, address, err)
|
||||
if err := database.GDB.Exec(
|
||||
`UPDATE commandes SET dest_latitude = NULL, dest_longitude = NULL WHERE id = ?`,
|
||||
commandID,
|
||||
).Error; err != nil {
|
||||
log.Printf("⚠️ [ADDR_GEOCODE] Erreur reset coordonnées cmd %d: %v", commandID, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := database.GDB.Exec(
|
||||
`UPDATE commandes SET dest_latitude = ?, dest_longitude = ? WHERE id = ?`,
|
||||
location.Latitude, location.Longitude, commandID,
|
||||
).Error; err != nil {
|
||||
log.Printf("⚠️ [ADDR_GEOCODE] Erreur mise à jour coordonnées cmd %d: %v", commandID, err)
|
||||
return
|
||||
}
|
||||
log.Printf("✅ [ADDR_GEOCODE] Coordonnées de destination mises à jour pour cmd %d", commandID)
|
||||
}
|
||||
|
||||
func UpdateCommandAddress(c *gin.Context) {
|
||||
database := c.MustGet("database").(*db.Database)
|
||||
geoService := c.MustGet("geoService").(*services.GeoService)
|
||||
|
||||
userRole := c.GetString("role")
|
||||
if !utils.CheckRoleAdmin(c, userRole) {
|
||||
@@ -138,6 +177,8 @@ func UpdateCommandAddress(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
updateCommandDestinationCoords(database, geoService, commandID, req.DeliveryAddress)
|
||||
|
||||
database.AddCommandLog(commandID, "address_updated",
|
||||
fmt.Sprintf("Adresse mise à jour par admin %s", adminUsername),
|
||||
adminUsername)
|
||||
@@ -220,6 +261,7 @@ func ProposeAddressChange(c *gin.Context) {
|
||||
// POST /api/v1/commands/:id/address/respond
|
||||
func RespondToAddressProposal(c *gin.Context) {
|
||||
database := c.MustGet("database").(*db.Database)
|
||||
geoService := c.MustGet("geoService").(*services.GeoService)
|
||||
|
||||
userRole := c.GetString("role")
|
||||
if !utils.CheckRoleClient(c, userRole) {
|
||||
@@ -246,11 +288,25 @@ func RespondToAddressProposal(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// La colonne proposed_address est vidée par RespondToAddressProposal dès
|
||||
// qu'elle est traitée : on la lit avant l'appel pour pouvoir regéocoder la
|
||||
// nouvelle adresse en cas d'acceptation.
|
||||
var proposedAddress string
|
||||
if req.Accepted {
|
||||
if command, err := database.GetCommandByID(commandID); err == nil {
|
||||
proposedAddress, _ = command["proposed_address"].(string)
|
||||
}
|
||||
}
|
||||
|
||||
if err := database.RespondToAddressProposal(commandID, clientUsername, req.Accepted); err != nil {
|
||||
utils.ServerErr(c, "Impossible de traiter la réponse", err)
|
||||
return
|
||||
}
|
||||
|
||||
if req.Accepted && proposedAddress != "" {
|
||||
updateCommandDestinationCoords(database, geoService, commandID, proposedAddress)
|
||||
}
|
||||
|
||||
action := "refusée"
|
||||
if req.Accepted {
|
||||
action = "acceptée"
|
||||
@@ -312,6 +368,8 @@ func UpdateOwnCommandAddress(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
updateCommandDestinationCoords(database, geoService, commandID, req.DeliveryAddress)
|
||||
|
||||
log.Printf("✅ [UPD_OWN_ADDR] Commande %d mise à jour par %s", commandID, clientUsername)
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"success": true,
|
||||
|
||||
@@ -70,10 +70,10 @@ func GetAdminStatsByMonth(c *gin.Context) {
|
||||
}
|
||||
monthStart = time.Date(monthStart.Year(), monthStart.Month(), 1, 0, 0, 0, 0, monthStart.Location())
|
||||
|
||||
resetCmd := database.ReadResetAt("stats_reset_commandes_at")
|
||||
filters := database.LoadAdminStatsFilters()
|
||||
|
||||
var rows []db.DailyMonthStatRow
|
||||
if err := database.StatsByDayForMonth(&rows, monthStart, resetCmd); err != nil {
|
||||
if err := database.StatsByDayForMonth(&rows, monthStart, filters.ResetCommandes, filters.ResetRevenus); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Erreur lors de la récupération des statistiques mensuelles: %s", err)})
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user