evol: filter geography on beneficiaries

This commit is contained in:
Arnaud Delcasse
2026-02-25 10:15:22 +01:00
parent 1b1c4443fc
commit 092d1acfbd
3 changed files with 99 additions and 9 deletions

View File

@@ -5,7 +5,9 @@ import (
"fmt"
"io"
"net/http"
"sort"
"strconv"
"strings"
"time"
formvalidators "git.coopgo.io/coopgo-apps/parcoursmob/core/utils/form-validators"
@@ -83,14 +85,64 @@ func (h *Handler) BeneficiariesListHTTPHandler() http.HandlerFunc {
archivedFilter = true
}
result, err := h.applicationHandler.GetBeneficiaries(r.Context(), searchFilter, archivedFilter)
// Extract beneficiary address geography filter
beneficiaryAddressGeo := r.URL.Query().Get("beneficiary_address_geo")
addressGeoLayer, addressGeoCode := "", ""
if beneficiaryAddressGeo != "" {
parts := strings.SplitN(beneficiaryAddressGeo, ":", 2)
if len(parts) == 2 {
addressGeoLayer, addressGeoCode = parts[0], parts[1]
}
}
result, err := h.applicationHandler.GetBeneficiaries(r.Context(), searchFilter, archivedFilter, addressGeoLayer, addressGeoCode)
if err != nil {
log.Error().Err(err).Msg("error retrieving beneficiaries")
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
h.renderer.BeneficiariesList(w, r, result.Accounts, result.CacheID, archivedFilter)
// Enrich geography filters with names from geography service
var enrichedGeoFilters []map[string]string
if h.cfg.GetBool("geography.filters.enabled") {
geoFilters := h.cfg.Get("geography.filters.geographies")
if geoList, ok := geoFilters.([]any); ok {
for _, geoItem := range geoList {
if geoMap, ok := geoItem.(map[string]any); ok {
layer := ""
code := ""
if l, ok := geoMap["layer"].(string); ok {
layer = l
}
if c, ok := geoMap["code"].(string); ok {
code = c
}
enrichedGeo := map[string]string{
"layer": layer,
"code": code,
"name": code,
}
if layer != "" && code != "" {
if geoFeature, err := h.services.Geography.Find(layer, code); err == nil {
if name := geoFeature.Properties.MustString("nom"); name != "" {
enrichedGeo["name"] = name
}
}
}
enrichedGeoFilters = append(enrichedGeoFilters, enrichedGeo)
}
}
}
sort.Slice(enrichedGeoFilters, func(i, j int) bool {
return enrichedGeoFilters[i]["name"] < enrichedGeoFilters[j]["name"]
})
}
h.renderer.BeneficiariesList(w, r, result.Accounts, result.CacheID, archivedFilter, enrichedGeoFilters, beneficiaryAddressGeo)
}
}